2017-10-04 73 views
0

我想用python子流程来执行一个脚本,这让我感兴趣的是能够导入我的项目。在另一个进程中运行时,我只有典型的模块,而不是进行导入时的项目。如何导入我的模块?Python子流程我无法导入其他模块

例子:

first_script.py

import subprocess 
from my_project.any_module import any_module 

def __init__(self): 
    subprocess.call(['python', 'path/to/exec/second_script.py']) 

second_script.py

from my_project.any_module import any_module 

def __init__(self): 
    print any_module.argument 

在第一个脚本,进口any_module作品,第二它没有。

任何想法?谢谢。

+0

你可以给真实的代码吗? –

+0

您不需要通过Python运行second_script。 'subprocess.call'应该抛出'OSError'。你是不是指'subprocess.call(['python','path/to/exec/second_script.py'])? – freakish

+0

是的,对不起。我的意思是subprocess.call(['python','path/to/exec/second_script.py']) – Francesc

回答

1

my_project模块需要在您的PYTHONPATH中,以便Python能够找到它。 PYTHONPATH包含您当前的工作目录,这就是您运行它时第一个脚本运行的原因。但是当你调用一个子进程时,cwd是不同的。因此,您需要将路径my_project添加到PYTHONPATH中,并将env参数显式指定为,明确指定PYTHONPATH。

但是,这种方式运行Python代码很尴尬。除非你有特定的要求来阻止这个,否则我会建议使用multiprocessing包代替在单独的进程中运行Python代码。

+0

如果pythonpath没有定义,我该怎么做?我通过添加当前路径来定义pythonpath,并将其传递给env? – Francesc

+0

你应该能够做到这一点,只需传递调用进程的环境:'subprocess.call(...,env = os.environ)'。 –