如何通过传递所有依赖项来在python中派生子进程

时间:2018-01-19 12:53:58

标签: python python-2.7 subprocess popen

我有一个python文件,比如A.py,它依赖于其他几个软件包/文件夹/文件让我们称之为B.py,C.py,D.py等。这些文件位于不同于A的位置的.py

A.py contents ::

import B, C, D
//other codes

我从另一个python脚本调用A.py,我们称之为1.py

1.py内容:

child_process = subprocess.Popen("python A.py", shell=True)

我在命令行中运行这样的1.py: python 1.py

我的问题是如何在子进程中将一系列依赖项(在本例中为B.py,C.py,D.py)传递给A.py以成功运行它。

我正在使用python 2.7

1 个答案:

答案 0 :(得分:2)

您应该在python路径中正确安装B / C / D个文件。 或者,您可以使用PYTHONPATH环境变量:

child_process = subprocess.Popen(['python', 'A.py'], env={'PYTHONPATH': '/path/to/the/directory'})

其中/path/to/the/directory是包含BCD的目录的路径。

根据A.py您可能需要传递的更多环境。这可以通过以下任一方式实现:

  • 在父进程中设置env变量并让子进程继承它:

    import os
    os.environ['PYTHONPATH'] = '/path/...'
    Popen(['python', 'A.py'])   # by default it inherits parent env
    
  • 或复制父环境:

    new_env = dict(os.environ) # make a copy
    new_env['PYTHONPATH']  = '/path/...'
    Popen(['python', 'A.py', env=new_env)
    

注意:使用shell=True是一种安全隐患。它也没用,而且效率低下。你应该避免它并将命令行作为字符串列表传递。