gpt4 book ai didi

python - Python 脚本中的 Bash 源

转载 作者:行者123 更新时间:2023-11-30 23:10:55 24 4
gpt4 key购买 nike

我正在编写一个包装器Python脚本,在运行其他一些工具之前需要source ./config。排除我的脚本提供的额外功能,它基本上是这样做的:

$ source ./config
$ ./a-tool.sh --args
$ ./another-tool.py --arg1 --arg2

转换为Python,我可以按照这个思路做一些事情来调用这两个脚本:

subprocess.call(['./a-tool.sh', '--args'])
subprocess.call(['./another-tool.py', '--arg1', '--arg2'])

但我不知道如何首先使用修改后的工具环境来获取。我已阅读Emulating Bash 'source' in Python ,但它建议一些 hack 来修改运行脚本的环境,这不是我想要的。

编辑:

为了澄清,我的脚本目前是一个 bash 脚本,它执行一系列检查、解析一些参数,并根据结果运行一个或多个如上所述的工具。 source 行并不总是需要的,而且并不总是相同的。但是,使用时,以下所有工具都需要在同一环境(即bash进程)中运行。在 bash 中,这很容易。但是,我想用 python 重写脚本,因为其他一些功能对我来说更容易用 python 编写和维护。这纯粹是基于偏好的语言选择,与实际功能无关。根据@abarnert的回答,我想我可以做类似的事情

subprocess.call(['source', '.config', ';', './a-tool.sh', ...])

但这看起来并不容易调试,所以我更喜欢这样的东西:

bash = subprocess.run('bash')
bash.execute('source ./config')
bash.execute('a-tool.sh --args')

有什么办法可以在Python中做到这一点吗?

最佳答案

source 所做的就是在当前 bash 解释器的上下文中运行脚本。

Python 解释器不是 bash 解释器,因此您的要求没有任何意义。*

通常,所有source的用途都是影响环境变量,所以这就是those "hacks" you linked是做。这并不是真正的黑客攻击。它假设脚本除了设置环境变量之外没有任何作用,但这应该是一个很好的假设;如果不是,那么无论它做什么,你都无法在 Python 中完成。

或者,您可以创建一个 bash 子进程,并使用它来source 脚本,然后运行其他程序,而不是直接将每个程序作为子进程运行Python。 (无论是动态构建脚本,还是为其提供非 tty 标准输入。)这是执行源脚本可能执行的所有操作的唯一真正安全的方法(因为它是实际源脚本的唯一方法)。

或者,作为一个稍微不同的技巧,将每个命令连接到您想要的脚本的末尾,并将其作为单独的bash子进程运行。只要没有 child 试图改变 parent 环境或类似环境中的事物,这通常就会起作用。

<小时/>

* 它可能bash 作为父级…但它也可能很容易没有…而且,即使有,那仍然不行你想要什么,除非你唯一想做的就是影响环境变量。

关于python - Python 脚本中的 Bash 源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30475980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com