关于子进程:从Python脚本中运行脚本

Running a script from within a Python script

我正试图从另一个python脚本运行位于服务器文件夹中的python脚本。我尝试运行的脚本的位置与现有脚本不在同一位置。我尝试执行的脚本不是一个函数,我只需要在第一个脚本完成后启动它,我知道它们都独立工作。我找到了一个类似的帖子,但当我使用os.systemsubprocess.Popen时,我得到了错误Not Found

我知道我调用的目录是正确的,因为在前面的语句中,我调用shutil.move将文件移动到我要运行的scipt所在的同一目录。

这就是我所尝试的:

1
2
3
4
5
subprocess.Popen("/home/xxx/xxxx/xxx/xx/test.py")

os.system("/home/xxx/xxxx/xxx/xx/test.py")

subprocess.Popen("/home/xxx/xxxx/xxx/xx/test.py", shell=True)


要将脚本作为子进程在其目录中运行,请使用cwd参数:

1
2
3
4
5
6
7
8
#!/usr/bin/env python
import os
import sys
from subprocess import check_call

script_path ="/home/xxx/xxxx/xxx/xx/test.py"
check_call([sys.executable or 'python', script_path],
           cwd=os.path.dirname(script_path))

与基于os.chdir()的解决方案的区别在于,chdir()只在子进程中调用。父工作目录保持不变。

sys.executable是执行父python脚本的python可执行文件。如果test.py有正确的shebang集,并且文件具有可执行权限,则可以直接运行它(使用[script_path]而不使用shell=True)。


你可以尝试这样的方法:

1
2
3
4
5
6
7
8
9
10
original_dir = os.getcwd()
script_paths = ["/...path1.../script1.py","/...path2.../script2.py","/...path3.../script3.py"]

for script_path in script_paths:
  base_path, script = os.path.split(script_path)
  os.chdir(original_dir)
  subprocess.Popen(script)


os.chdir(original_dir)


对于执行与其位置相关操作的脚本,您需要首先获取使用originalDir = os.path.dirname(full_path)的当前目录。接下来,您将要使用os.chdir('/home/xxx/xxxx/xxx/xx/'),然后执行subprocess.Popen("python test.py", shell=True)来运行脚本。然后做一个os.chdir(originalDir)返回到您曾经所在的目录。