如果自定义模块不在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中设置的)
答案 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首先)。