python - 怎么打电话。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 代码并提供所需的输出。
有人可以帮忙吗?
解决方案
环境变量不直接由父进程继承,这就是为什么您的简单方法不起作用的原因。
如果您尝试获取已在您的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 代码时,您可以运行包装器。
推荐阅读
- php - 从 foreach xml 值中的 foreach 在数组中创建数组
- robotframework - 网页上的文字可见
- python - Abaqus python脚本:选择共享相同坐标的两个连接器之一
- r - 尝试在 R 中生成相关矩阵的“未使用参数”错误消息
- python - Plotly:如何查找和注释两条线之间的交点?
- timestamp - Sectigo 时间戳服务器总是使用 SHA384 而不是 SHA1
- python - 如何从列表中创建 Pandas 数据框?
- sql - SQL 是否有能力取值、使用逻辑并产生不同的值
- android - 无法销毁活动 Android:Google Play 控制台错误
- javascript - 标题栏图片显示在一页上,但不显示其他页面