从另一个Python脚本运行一个Python脚本,传入参数

我想从另一个Python脚本运行一个Python脚本。 我想要像使用命令行一样传递variables。

例如,我将运行我的第一个脚本,它将遍历值列表(0,1,2,3)并将其传递给第二个脚本script2.py 0然后script2.py 1等。

我发现SO 1186789这是一个类似的问题,但阿尔斯的答案调用函数,因为我想运行整个脚本不只是一个函数,和balpha的答案调用脚本,但没有参数。 我将其改为如下所示的testing:

 execfile("script2.py 1") 

但它不能正确接受variables。 当我打印出script2.py中的sys.argv ,它是对第一个脚本“['C:\ script1.py']”的原始命令调用。

我真的不想改变原来的脚本(即我的例子中的script2.py),因为我不拥有它。

我认为必须有办法做到这一点,我只是困惑你如何做到这一点。

尝试使用os.system

 os.system("script2.py 1") 

execfile是不同的,因为它被devise为在当前执行上下文中运行一系列Python语句。 这就是为什么sys.argv没有改变。

这本质上是错误的。 如果您从另一个Python脚本运行Python脚本,则应该通过Python而不是通过操作系统进行通信:

 import script1 

在理想的世界中,您将能够直接在script1调用一个函数:

 for i in range(whatever): script1.some_function(i) 

如果有必要,你可以破解sys.argv 。 使用上下文pipe理器可以很好地完成这个任务,以确保您不会做出任何永久更改。

 import contextlib @contextlib.contextmanager def redirect_argv(num): sys._argv = sys.argv[:] sys.argv=[str(num)] yield sys.argv = sys._argv with redirect_argv(1): print(sys.argv) 

我认为这比将所有数据传递到操作系统并返回更可取, 那简直是愚蠢的

理想情况下,您要运行的Python脚本将在接近结束时使用类似下面的代码进行设置:

 def main(arg1, arg2, etc): # do whatever the script does if __name__ == "__main__": main(sys.argv[1], sys.argv[2], sys.argv[3]) 

换句话说, 如果从命令行调用该模块,它将parsing命令行选项,然后调用另一个函数main()来执行实际的工作。 (实际的参数会有所不同,parsing可能会涉及更多。)

但是,如果您想从另一个Python脚本调用这样的脚本,则可以直接import它并直接调用modulename.main() ,而不是通过操作系统。

os.system可以工作,但是这是一个迂回的(读“慢”)方法,因为你每次都是在开始一个全新的Python解释器过程,而不是每次都是葡萄干。

SubProcess模块​​:
http://docs.python.org/dev/library/subprocess.html#using-the-subprocess-module

 import subprocess subprocess.Popen("script2.py 1", shell=True) 

有了这个,你也可以redirectstdin,stdout和stderr。

我认为好的做法可能是这样的;

 import subprocess cmd = 'python script.py' p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) out, err = p.communicate() result = out.split('\n') for lin in result: if not lin.startswith('#'): print(lin) 

根据文档subprocess模块允许你产生新的进程,连接到他们的input/输出/错误pipe道,并获得他们的返回代码。 这个模块打算取代几个较旧的模块和function:

 os.system os.spawn* os.popen* popen2.* commands.* 

使用通讯()而不是.stdin.write,.stdout.read或.stderr.read来避免由于任何其他OSpipe道缓冲区填满和阻塞subprocess而导致的死锁。 阅读这里

 import subprocess subprocess.call(" python script2.py 1", shell=True) 

如果os.system对你来说不够强大,那就是subprocess模块 。