【问题标题】:How call a python script from a python process如何从 python 进程调用 python 脚本
【发布时间】:2020-06-01 10:25:41
【问题描述】:

我必须从一个瓶子脚本(如 Django 之类的网络框架)中调用一个长期运行的过程。

所以我有一个瓶子脚本

os.system("python /home/tom/Documents/proc_test/main.py")

反正 main.py 脚本没有被执行。 如何从另一个正在运行的 python 程序调用 python 脚本?

P.S: 在 python shell 解释器中我写了 os.system("python /home/tom/Documents/proc_test/main.py") 并且文件被调用

【问题讨论】:

  • 这是蟒蛇。导入并调用函数。
  • 你试过exec吗? exec(open("/home/tom/Documents/proc_test/main.py").read()) 它只有在文件是可执行的情况下才有效。不相关,但我更喜欢使用subprocess 模块来执行二进制文件。
  • @Frodon 你能避免建议更糟糕的解决方案吗?
  • "main.py 脚本未执行" => 那么您可能想找出原因。 “我如何从另一个正在运行的 python 程序中调用 python 脚本?” => 就像任何其他可执行文件一样 - 使用 os.systemsubprocess。但除非您有令人信服的理由将其作为一个独立的进程运行,否则您可能应该将脚本作为模块导入并调用它的入口点(假设它编写正确,因此可以这样使用)。

标签: python python-3.x


【解决方案1】:

您可以使用importlib直接通过完整路径导入python脚本。
让我们假设这个例子 main.py:

def func():
    print("func called")

在你的主脚本中,你导入如下:

import importlib as imp
spec = imp.util.spec_from_file_location('d', '/home/tom/Documents/proc_test/main.py')
foo = imp.util.module_from_spec(spec)
spec.loader.exec_module(foo)

foo.func()

输出:

func called

【讨论】:

    【解决方案2】:

    像 Dirk 建议的那样,从 python 导入 main.py 然后调用该函数。

    或者,如果您需要将 main.py 作为单独的进程实际运行,请使用 subprocess 模块。

    import subprocess
    subprocess.call(["python /home/tom/Documents/proc_test/main.py"])
    

    希望对你有帮助

    【讨论】:

    • 这与os.system 有何不同?
    • os.system() 在子 shell 中执行命令(字符串)。这是通过调用标准 C 函数 system() 来实现的,并且具有相同的限制。对 sys.stdin 等的更改不会反映在执行命令的环境中。如果命令生成任何输出,它将被发送到解释器标准输出流。在 Unix 上,返回值是以 wait() 指定的格式编码的进程的退出状态。注意POSIX并没有说明C system()函数返回值的含义,所以Python函数的返回值是系统相关的。
    • 子进程模块提供了更强大的工具来生成新进程并检索它们的结果;使用该模块优于使用 os.system()
    • 我的意思是:python /home/tom/Documents/proc_test/main.py如果不通过 os.system() 为什么要通过子进程运行?
    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    相关资源
    最近更新 更多