运行子进程以调用另一个python脚本,而无需等待

时间:2018-08-26 22:40:11

标签: python

我现在已经读懂了很多线程,但真的很迷路。

在变得复杂之前,只需尝试做一些基本的事情。

所以我有一个脚本test.py

我想从runme.py内调用脚本,但不等待,因此它将处理其他代码块,但是到最后,请等待test.py代码完成再继续。

我似乎无法找出p =子进程的正确语法。Popen(我尝试了很多)

,如果它在同一目录中,我是否需要在test.py中使用它?

这是我所拥有的但无法上班。

import subprocess
p = subprocess.Popen(['python test.py'])
#do some code
p.wait()

1 个答案:

答案 0 :(得分:1)

  

我似乎无法找出p =子进程的正确语法。Popen(我尝试了很多)

您要向其传递参数列表。第一个参数是要运行的程序python(尽管实际上,您可能希望在这里使用sys.executable);第二个是您希望python运行的脚本。所以:

p = subprocess.Popen(['python', 'test.py'])

  

并且如果它在同一目录中,我是否需要在test.py中使用它?

这将与您在shell上运行python test.py的方式相同:它将按原样将test.py传递给python,而python将作为相对于当前工作目录(CWD)的路径。

因此,如果test.py在CWD中,则可以使用。

如果test.py在其他位置,则需要提供一个绝对路径或相对于CWD的路径。

您想要的一件事是test.py不一定位于CWD中,而是与要启动它的脚本/模块位于同一目录中。

scriptpath = os.path.join(os.path.dirname(__file__), 'test.py')

…或与用于启动程序的主脚本相同的目录: 1

scriptpath = os.path.join(os.path.dirname(sys.argv[0]), 'test.py')

无论哪种方式,您都可以将其作为参数传递:

p = subprocess.Popen(['python', scriptpath])

1。在某些平台上,这实际上可能是相对路径。如果您自启动以来可能已经完成过os.chdir的操作,那将是错误的。如果需要处理此问题,则希望在启动时将os.path.abspath(os.path.dirname(sys.argv[0]))存放在主脚本中,然后将其传递给其他函数供他们使用,而不是自己调用dirname(argv[0])