使用subprocess.Popen()在python脚本中设置PYTHONPATH失败

时间:2016-12-17 13:12:57

标签: python

如果自定义模块不在sys.path变量的任何目录中,则以下代码允许我动态识别和加载自定义模块

import sys
sys.path.append("/lib")

但是,这给了我OSError

import subprocess
x = subprocess.Popen(["export", "PYTHONPATH=/lib"], stdout=subprocess.PIPE)

不仅如此,即使简单的Linux / Unix变量声明设置在subprocess.Popen()

中也会失败
import subprocess
x = subprocess.Popen("x=y", stdout=subprocess.PIPE)

我想检查子进程,因为我尝试通过os.system(),os.popen()等设置PYTHONPATH,并且变量没有设置(可能是在子进程shell中设置的)

2 个答案:

答案 0 :(得分:1)

试试这个:

>>> subprocess.call(["export foo=bar && echo foo=$foo"], shell=True)
foo=bar
0
>>> 

答案 1 :(得分:1)

这里发生了一些事情,可能会让你感到困惑。有一点是,无论给予Popen的任何指令都将在子进程中执行,并且不会影响您的主进程。您只能管道或从中检索结果。

首先评论您的第二个用例,其中您使用字符串作为参数。从文档中你可以阅读:

  

class subprocess.Popen(args,bufsize = -1,executable = None,stdin = None,   stdout = None,stderr = None,preexec_fn = None,close_fds = True,   shell = False,cwd = None,env = None,universal_newlines = False,   startupinfo = None,creationflags = 0,restore_signals = True,   start_new_session = False,pass_fds =())

...

  

args应该是一系列程序参数,否则就是一个   串。默认情况下,要执行的程序是args中的第一项   如果args是一个序列。如果args是一个字符串,则解释为   平台依赖并在下面描述。查看shell和可执行文件   与默认行为的其他差异的参数。除非   除非另有说明,建议将args作为序列传递。

     

在POSIX上,如果args是一个字符串,则该字符串被解释为名称   或者要执行的程序的路径。但是,这只能在以下情况下完成   没有将参数传递给程序。

所以在你的第二种情况下,你试图执行一个文件或程序x = y,但是没有。

即使您使用list,就像在第一个用例中一样,您必须知道,这不等于将代码传递给bash shell。如果您需要此功能,可以使用 shell = True 作为关键字参数,但这还有其他问题,如文档所示。但是您的代码执行shell = True。

如果您的唯一目的是设置环境变量,那么您应该考虑使用 os.environ 变量将环境变量映射到值的选项(如下所示) @cdarke首先)。