Python - 如何调用外部python程序?

时间:2012-02-16 20:30:30

标签: python call external

我会在此之前说这是一项家庭作业。我不希望代码写给我,只是指向正确的方向。

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

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

4 个答案:

答案 0 :(得分:30)

如果要将每个调用为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()

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

答案 1 :(得分:3)

查看subprocess文档。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

如果要加载外部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