【问题标题】:Running a script from within a Python script从 Python 脚本中运行脚本
【发布时间】:2015-02-25 22:23:42
【问题描述】:

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

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

这是我尝试过的:

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)

【问题讨论】:

  • os.chdir() 会让你移动到其他 python 脚本的位置
  • 您认为运行 *.py 文件时会发生什么?显然 test.py 的源代码中没有 python 解释器...
  • @NSH 错误 test.py 脚本工作
  • @Dan 获取您所在的当前目录。使用 os.chdir() 更改目录,运行脚本,返回您所在的目录
  • 它的顶部有shebang,是的。

标签: python subprocess os.system


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    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)
    

    【讨论】:

      【解决方案3】:

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

      #!/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)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2016-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        相关资源
        最近更新 更多