首页 > 解决方案 > 怎么打电话。python脚本中的/home/test.sh文件

问题描述

我有一个名为. /home/test.sh(第一个./故意之间的空格)的文件,其中包含一些环境变量。我需要加载这个文件并运行.py. 如果我首先在 Linux 服务器上手动运行命令,然后运行 ​​python 脚本,它会生成所需的输出。但是,我想. /home/test.sh从 python 中调用以加载配置文件并运行其余代码。如果未加载此配置文件,python 脚本将运行并给出 0 作为输出。

通话

subprocess.call('. /home/test.sh',shell=True)

运行良好,但配置文件未加载到 Linux 终端上以执行 python 代码并提供所需的输出。

有人可以帮忙吗?

标签: pythonsubprocess

解决方案


环境变量不直接由父进程继承,这就是为什么您的简单方法不起作用的原因。

如果您尝试获取已在您的test.sh.env在本地设置它们。

test.sh如果本身不写任何输出,则下面的代码将起作用。(如果确实如此,那么您可以采取的解决方法是在echo获取它之后使用一些分隔符字符串,然后在运行之前env,然后在 Python 代码中,剥离分隔符字符串及其之前的所有内容。)

import subprocess
import os

p = subprocess.Popen(". /home/test.sh; env -0", shell=True, 
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)

out, _ = p.communicate()

for varspec in out.decode().split("\x00")[:-1]:
    pos = varspec.index("=")
    name = varspec[:pos]
    value = varspec[pos + 1:]
    os.environ[name] = value

# just to test whether it works - output of the following should include
# the variables that were set
os.system("env")

还值得考虑的是,如果只想在每次运行任何 python 代码之前设置一些环境变量,那么一个选项就是test.sh从 shell-script 包装器中获取您的源,而不是尝试在 python 中设置它们根本:

#!/bin/sh
. /home/test.sh
exec "/path/to/your/python/script $@"

然后,当您想要运行 Python 代码时,您可以运行包装器。


推荐阅读