【问题标题】:Python - how do I call external python programs?Python - 如何调用外部 Python 程序?
【发布时间】:2012-03-08 06:46:11
【问题描述】:

我先说这是一项家庭作业。我不想为我编写代码,只是为了指出正确的方向。

我们能够开展我们选择的项目,因此我正在开展一个计划,以成为我迄今为止所写所有内容的迷你作品集。所以我要制作一个程序,用户将输入程序的名称(从给定的列表中选择),然后在现有的 shell 中运行选择的程序。

但是,我真的找不到有关如何调用外部程序的信息。谁能指出我正确的方向?我考虑将所有代码放在一个带有一堆 if 循环的长程序中以执行正确的代码,但我想让它比这更复杂一点。

【问题讨论】:

  • 在编程网站上发帖并要求不要获取代码就像去水上乐园并要求不要被淋湿。
  • 我更需要这个概念。我喜欢自学的满足感。

标签: python call external


【解决方案1】:

如果你想调用每个 Python 脚本,你可以这样做

import subprocess
subprocess.call(["python", "myscript.py"])
subprocess.call(["python", "myscript2.py"])

但更好的方法是调用您在其他脚本中编写的函数,如下所示:

import myscript
import myscript2

myscript.function_from_script1()
myscript2.function_from_script2()

function_from_script1() 等在 myscript.py 和 myscript2.py 文件中定义。有关更多信息,请参阅modules 上的此页面。

【讨论】:

    【解决方案2】:

    查看subprocess 文档。

    【讨论】:

      【解决方案3】:

      此外,如果您需要传递其他参数,请执行以下操作:

      import subprocess
      subprocess.call(["python", "myscript.py", "arg1", "arg2", "argN"])
      

      【讨论】:

        【解决方案4】:

        如果你想加载一个外部 Python 文件并在当前解释器中运行它而不需要处理模块,你可以使用标准的importlib.util 模块。

        当您需要发布一些 Python 脚本用于演示目的时,这很有用,但您不想让它们成为(子)模块的一部分——同时仍然能够自动运行它们,例如在集成测试期间.这是一个例子:

        # A sample Python script
        sh$ cat snippet/demo.py 
        SOME_MODULE_GLOBAL=True
        print("Hello, here is the demo snippet!")
        # There is no `__init__.py in the _snippet_ directory
        sh$ cat snippet/__init__.py
        cat: snippet/__init__.py: No such file or directory
        

        现在使用importlib.util,您可以加载demo.py,即使它不是模块的一部分:

        >>> import importlib.util
        
        # Bypass the standard import machinery to manually load a Python script from
        # a filepath
        >>> spec = importlib.util.spec_from_file_location('demo','snippet/demo.py')
        >>> spec
        ModuleSpec(name='demo', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fa549344eb8>, origin='snippet/demo.py')
        >>> module = importlib.util.module_from_spec(spec)
        >>> module
        <module 'demo' from 'snippet/demo.py'>
        
        # The next command will run the module:
        >>> spec.loader.exec_module(module)
        Hello, here is the demo snippet!
        
        # Module variables are accessible just like if it was a
        # _normally_ imported module:
        >>> module.SOME_MODULE_GLOBAL
        True
        

        【讨论】:

          猜你喜欢
          • 2012-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多