我有一个看起来像这样的脚本:
export foo=/tmp/foo
export bar=/tmp/bar
Run Code Online (Sandbox Code Playgroud)
每次我构建时都运行'source init_env'(其中init_env是上面的脚本)来设置一些变量.
为了在Python中实现同样的目的,我运行了这个代码,
reg = re.compile('export (?P<name>\w+)(\=(?P<value>.+))*')
for line in open(file):
m = reg.match(line)
if m:
name = m.group('name')
value = ''
if m.group('value'):
value = m.group('value')
os.putenv(name, value)
Run Code Online (Sandbox Code Playgroud)
但后来有人决定在init_env文件中添加如下行:
export PATH="/foo/bar:/bar/foo:$PATH"
Run Code Online (Sandbox Code Playgroud)
显然我的Python脚本崩溃了.我可以修改Python脚本来处理这一行,但是当有人想出一个在init_env文件中使用的新功能时,它就会破坏.
问题是,是否有一种简单的方法来运行Bash命令并让它修改我的os.environ?
我对subprocess使用时如何搜索可执行文件感到困惑Popen().如果给定子进程的绝对路径,它可以工作,但我正在尝试使用相对路径.我发现如果我设置环境变量PYTHONPATH然后我可以从该路径获得导入的模块,并且PYTHONPATH存在sys.path,但它似乎没有帮助的行为subprocess.Popen.我也尝试过编辑sitecustomize.py添加PYTHONPATH 的文件os.environ,就像这样
# copy PYTHONPATH environment variable into PATH to allow our stuff to use
# relative paths for subprocess spawning
import os
if os.getenv('PYTHONPATH') is not None and os.getenv('PATH') is not none:
os.environ['PATH'] = ':'.join([os.getenv('PATH'), os.getenv('PYTHONPATH')])
Run Code Online (Sandbox Code Playgroud)
并且验证了在启动python时,无论是交互式地,使用ipython,还是通过从命令行运行脚本,PYTHONPATH都成功出现os.environ.但是,subrocess.Popen 仍然不在那里搜索可执行文件.如果没有env指定kwarg ,我认为它应该继承父母的环境?接下来我尝试env明确地给出,首先通过制作副本,os.getenv然后仅仅通过给予env={'PATH': '/explicit/path/to/search/from'},它仍然找不到可执行文件.现在我很难过.
希望一个例子可以帮助我更清楚地解释我的问题:
/ dir/subdir1/some_executable
/dir/subdir2/some_script.py
# some_script.py
from subprocess import Popen, PIPE
spam, eggs = Popen(['../subdir1/some_executable'], …Run Code Online (Sandbox Code Playgroud) 我有一个.sh脚本,我打电话给source the_script.sh.定期打电话很好.但是,我试图通过我的python脚本调用它subprocess.Popen.
从Popen调用它,我在以下两个场景调用中遇到以下错误:
foo = subprocess.Popen("source the_script.sh")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 672, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1213, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
>>> foo = subprocess.Popen("source the_script.sh", shell = True)
>>> /bin/sh: source: not found
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?为什么我不能从Popen中调用"source",当我可以在python之外?