我会在此之前说这是一项家庭作业。我不希望代码写给我,只是指向正确的方向。
我们能够在我们选择的项目上工作,所以我正在制定一个程序,成为我迄今为止所写的所有内容的迷你组合。因此,我将创建一个程序,用户将输入程序的名称(从给定列表中选择),然后在现有shell中运行所选程序。
但是,我无法真正找到有关如何调用外部程序的信息。谁能指出我正确的方向?我考虑将所有代码放在一个带有一堆if循环的长程序中来执行正确的代码,但是我想让它比BIT更复杂。
答案 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