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

31

首先,我想说明这是一项作业任务。我不需要别人替我写代码,只需要指明正确的方向即可。

我们可以选择自己的项目进行开发,所以我正在编写一个程序,用来展示我迄今为止所写的所有东西。因此,我将制作一个程序,用户将输入程序的名称(从给定的列表中选择),然后在现有的shell中运行所选的程序。

但是,我无法找到如何调用外部程序的信息。是否有人能够指导我正确的方向?我考虑将所有代码放在一个长程序中,并使用一堆if循环来执行正确的代码,但我希望它比那要复杂一点。


7
在一个编程网站上发帖并要求不给出代码,就像去水上乐园却不想淋湿一样。 - user849425
12
我更关注概念本身。我喜欢通过自学获得的满足感。 - Henry Edward Quinn IV
4个回答

42

如果你想要将它们作为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()等函数。有关更多信息,请参阅模块页面。


5

4

如果您需要传递额外的参数,请按照以下方式操作:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接