当前位置: 首页 > 面试题库 >

python子进程Popen环境PATH?

裴俊能
2023-03-14
问题内容

我对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')])

并验证了在以交互方式,与ipython或通过从命令行运行脚本启动python时,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'], stdout=PIPE, stderr=PIPE).communicate()

如果我在/dir/subdir2我运行python some_script.py它的工作原理,但如果我在/dir我运行python subdir2/some_script.py但即使/dir/subdir2是在os.environ['PATH'],那么子进程将抛出OSError: [Errno 2] No such file or directory


问题答案:

(填写评论的详细信息以做出单独的答案)

首先,无论您做什么,都不会在任何PATH中检查相对路径(包含斜杠的路径)。它们仅相对于 当前工作目录
。如果您需要解析相对路径,则必须手动搜索PATH,或者对PATH进行修改以使其包含子目录,然后按照下面的建议使用命令名即可。

如果要 相对于Python脚本的位置 运行程序,请使用__file__并从那里查找程序的绝对路径,然后使用中的绝对路径Popen

其次,Python错误跟踪器中存在一个有关Python如何处理裸命令(无斜杠)的问题。基本上,在UNIX
/ MacPopen使用os.execvp调用shell=False,它看起来在其价值的手段PATH ,因为它是在Python的推出
也没有改变的量os.environ会帮你解决这个问题。此外,在带有的Windows上shell=False,它根本不关注PATH,而只会相对于当前工作目录进行查找。

如果您只需要路径评估,而又不是真的想通过shell运行命令行,并且在UNIX上,建议您使用env代替shell=True,如中所述Popen(['/usr/bin/env', 'progtorun', other, args], ...)。这使您可以将不同的PATH传递给env进程,该进程将使用它来查找程序。它还避免了外壳元字符的问题和通过外壳传递参数的潜在安全问题。显然,在Windows(几乎是唯一没有的平台/usr/bin/env)上,您将需要做一些不同的事情。



 类似资料:
  • 问题内容: 我相信在环境稍有修改的情况下运行外部命令是很常见的情况。这就是我倾向于这样做的方式: 我感觉到有更好的办法了。看起来还好吗? 问题答案: 我认为如果你不打算为当前过程修改会更好:

  • 我试图使用popen启动一个子进程,该子进程一个接一个地调用两个命令(带有多个参数)。第二个命令依赖于第一个命令的运行,因此我希望使用一个子进程同时运行这两个命令,而不是生成两个进程并等待第一个。 但是我遇到了一些问题,因为我不知道如何给出两个命令输入,或者如何将命令作为一个对象分开。 另外,如果可能的话,我会尽量避免将shell设置为true。 这基本上就是我要做的:

  • 问题内容: 我正在尝试使用PyQt为名为“ HandBrake”的视频转换器应用程序构建一个简单的GUI。 我的问题是,当我选择要转换的视频文件时,子进程Popen使用必需的args启动手刹应用程序,但是在等待手刹完成gui时会被阻止,因此我无法进行任何更改。(例如:我不能禁用按钮,也不能更改其文本) 我不是在寻找更复杂的解决方案,例如progressbar等,但是我想在等待程序完成转换的同时简单

  • 前几天我注意到一个相当有趣的问题。 我在Windows服务器2008 RT上有一个Windows计划任务。此任务运行一个运行我构建的python脚本的批处理文件。在这个python脚本中有一个subprocess.Popen调用来运行其他几个批处理文件。但是在过去的几天里,我注意到该任务已成功运行,但辅助批处理文件没有。我知道python脚本成功运行是因为它创建的日志和它制作的辅助批处理文件使用的

  • 问题内容: 我在看这个问题。 就我而言,我想做一个: 现在,我可以在命令行中检查“ ls文件夹/*.txt”的工作原理,因为该文件夹包含许多.txt文件。 但是在Python(2.6)中,我得到了: ls:无法访问*:没有此类文件或目录 我尝试做: 和其他变体,但似乎根本不喜欢角色。 还有其他逃生方法吗? 问题答案: 被您的外壳自动展开。如果您引用,则不起作用: 如果要获取与模式匹配的文件,请使用

  • 我正在学习,但我对这段代码有点困惑: 输出: 如您所见,输出是格式化的。但是我不知道为什么结尾有字符和。 如果我在终端中运行此命令,则没有这些字符。 正常输出: 我怎样才能移除它们?