Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用subprocess.Popen()在python脚本中设置PYTHONPATH失败_Python - Fatal编程技术网

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

使用subprocess.Popen()在python脚本中设置PYTHONPATH失败,python,Python,如果自定义模块不在sys.path变量的任何目录中,下面的代码允许我动态识别和加载该模块 import sys sys.path.append("/lib") 但是,这给了我一个错误 import subprocess x = subprocess.Popen(["export", "PYTHONPATH=/lib"], stdout=subprocess.PIPE) 不仅如此,在subprocess.Popen()中,即使是简单的Linux/Unix变量声明设置也会失败 当我试图通过os.

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

import sys
sys.path.append("/lib")
但是,这给了我一个错误

import subprocess
x = subprocess.Popen(["export", "PYTHONPATH=/lib"], stdout=subprocess.PIPE)
不仅如此,在subprocess.Popen()中,即使是简单的Linux/Unix变量声明设置也会失败

当我试图通过os.system()、os.popen()等设置PYTHONPATH时,我想检查子进程,但变量没有设置(可能是在子进程shell中设置的)

尝试以下操作:

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

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

首先对第二个用例进行注释,在这个用例中,您使用字符串作为参数。从文档中,您可以阅读:

类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\u newlines=False, startupinfo=None,creationflags=0,restore\u signals=True, 启动新会话=False,通过会话=())

args应该是程序参数序列,或者是单个参数 一串默认情况下,要执行的程序是args中的第一项 如果args是一个序列。如果args是字符串,则解释为 平台相关,如下所述。请参阅shell和可执行文件 与默认行为的其他差异的参数。除非 否则,建议按顺序传递参数

在POSIX上,如果args是字符串,则该字符串将被解释为名称 或要执行的程序路径。但是,只有在 不向程序传递参数

因此,在第二种情况下,您试图执行一个文件或程序x=y,但它没有运行

即使像在第一个用例中一样使用list,也必须注意,这并不等同于将代码传递给bashshell。如果需要,可以使用shell=True作为关键字参数,但文档中指出了其他问题。但是您的代码将使用shell=True执行


如果您的唯一目的是设置环境变量,那么您应该考虑使用<强> OS.Envion <强>变量,将环境变量映射为值(如@ Cdulk首先指出)。

<代码>导出< /C> >是一个内置的shell命令,而不是程序。无论如何,在子进程中设置它不会影响当前的python进程。您需要
os.environ
.os.environ[“PYTHONPATH”]=“/dir”和subprocess.call([“export PYTHONPATH=/dir”],shell=True)这两个代码都可以帮助我设置环境变量PYTHONPATH,但是,即使设置了它,我也无法加载该目录下的模块,并且我看不到将该目录项注入sys.path变量
subprocess.call([“export PYTHONPATH=/dir”],shell=True)
只会影响该子进程--环境变量不是全局的,它们不是共享的,它们从父对象复制到子对象。设置
os.environ[“PYTHONPATH”]=“dir”
将不会设置当前进程的
sys.path
,因为PYTHONPATH是在进程启动时读取的,而不是稍后读取的。
>>> subprocess.call(["export foo=bar && echo foo=$foo"], shell=True)
foo=bar
0
>>>