如何从另一个脚本调用一个脚本?
- 2024-11-27 10:42:00
- admin 原创
- 13
问题描述:
我有一个名为的脚本,test1.py
它不在模块中。它只包含脚本本身运行时应执行的代码。没有函数、类、方法等。我有另一个作为服务运行的脚本。我想test1.py
从作为服务运行的脚本中调用。
例如:
文件test1.py
:
print "I am a test"
print "see! I do nothing productive."
文件service.py
:
# Lots of stuff here
test1.py # do whatever is in test1.py
解决方案 1:
通常的做法如下。
测试1.py
def some_func():
print 'in test 1, unproductive'
if __name__ == '__main__':
# test1.py executed as script
# do something
some_func()
服务.py
import test1
def service_func():
print 'service func'
if __name__ == '__main__':
# service.py executed as script
# do something
service_func()
test1.some_func()
解决方案 2:
在 Python 2 中可以使用以下方法实现execfile
:
execfile("test2.py")
在 Python 3 中,可以使用以下方法实现exec
:
exec(open("test2.py").read())
如果对于您的情况来说很重要,请参阅有关命名空间处理的文档。
但是,您应该考虑使用不同的方法;您的想法(从我所看到的)看起来不太清晰。
解决方案 3:
另一种方法:
文件test1.py:
print "test1.py"
文件service.py:
import subprocess
subprocess.call("test1.py", shell=True)
这种方法的优点是您不必编辑现有的 Python 脚本即可将其所有代码放入子例程中。
文档:Python 2、Python 3
解决方案 4:
import os
os.system("python myOtherScript.py arg1 arg2 arg3")
使用 os,您可以直接调用终端。如果您想要更具体,您可以将输入字符串与局部变量连接起来,即。
command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)
解决方案 5:
我更喜欢runpy:
#!/usr/bin/env python
# coding: utf-8
import runpy
runpy.run_path(path_name='script-01.py')
runpy.run_path(path_name='script-02.py')
runpy.run_path(path_name='script-03.py')
解决方案 6:
如果您希望 test1.py 保持可执行状态,并具有与在 service.py 内部调用时相同的功能,请执行以下操作:
测试1.py
def main():
print "I am a test"
print "see! I do nothing productive."
if __name__ == "__main__":
main()
服务.py
import test1
# lots of stuff here
test1.main() # do whatever is in test1.py
解决方案 7:
你不应该这样做。相反,你应该这样做:
测试1.py:
def print_test():
print "I am a test"
print "see! I do nothing productive."
服务.py
#near the top
from test1 import print_test
#lots of stuff here
print_test()
解决方案 8:
第一次使用时使用import test1
- 它将执行脚本。对于后续调用,将脚本视为导入的模块,并调用该reload(test1)
方法。
何时
reload(module)
执行:
Python 模块的代码被重新编译,模块级代码被重新执行,定义一组新的对象,这些对象与模块字典中的名称绑定在一起。扩展模块的 init 函数不会被调用
可以使用简单的检查sys.modules
来调用适当的操作。要继续将脚本名称引用为字符串 ( 'test1'
),请使用内置的“ import ()”。
import sys
if sys.modules.has_key['test1']:
reload(sys.modules['test1'])
else:
__import__('test1')
解决方案 9:
为什么不直接导入 test1?每个 python 脚本都是一个模块。更好的方法是在 test1.py 中有一个函数(例如 main/run),导入 test1 并运行 test1.main()。或者您可以将 test1.py 作为子进程执行。
解决方案 10:
正如前面提到的,runpy
这是一种从当前脚本运行其他脚本或模块的好方法。
顺便说一句,跟踪器或调试器这样做很常见,在这种情况下,直接导入文件或在子进程中运行文件等方法通常不起作用。
exec
使用运行代码时也需要注意。您必须提供适当的信息run_globals
以避免导入错误或其他问题。runpy._run_code
有关详细信息,请参阅。
解决方案 11:
将其添加到你的python脚本中。
import os
os.system("exec /path/to/another/script")
这将执行该命令,就像它被输入到 shell 中一样。
解决方案 12:
使用子进程执行此操作的一个例子。
from subprocess import run
import sys
run([sys.executable, 'fullpathofyourfile.py'])
解决方案 13:
这是一个subprocess
带库的示例:
import subprocess
python_version = '3'
path_to_run = './'
py_name = '__main__.py'
# args = [f"python{python_version}", f"{path_to_run}{py_name}"] # works in python3
args = ["python{}".format(python_version), "{}{}".format(path_to_run, py_name)]
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()
if not error_:
print(output)
else:
print(error_)
解决方案 14:
我发现runpy
标准库最方便。为什么?你必须考虑test1.py
脚本中出现错误的情况,并且runpy
你可以在service.py
代码中处理这种情况。回溯文本(将错误写入日志文件以供将来调查)和错误对象(根据错误类型处理错误):当使用subprocess
库时,我无法将错误对象从test1.py
提升到service.py
,只能回溯输出。此外,与“将 test1.py 作为模块导入”解决方案相比,runpy
更好,因为你不需要将代码包装test1.py
到def main():
函数中。
以一段代码为例,使用traceback
模块来捕获最后的错误文本:
import traceback
import runpy #https://www.tutorialspoint.com/locating-and-executing-python-modules-runpy
from datetime import datetime
try:
runpy.run_path("./E4P_PPP_2.py")
except Exception as e:
print("Error occurred during execution at " + str(datetime.now().date()) + " {}".format(datetime.now().time()))
print(traceback.format_exc())
print(e)
解决方案 15:
这个过程有点非正统,但适用于所有 Python 版本,
假设你想在 if 条件中执行名为“recommend.py”的脚本,那么使用,
if condition:
import recommend
虽然技术不同,但有效!
解决方案 16:
根据给出的例子,这是最好的方法:
# test1.py
def foo():
print("hellow")
# test2.py
from test1 import foo # might be different if in different folder.
foo()
但根据标题,使用os.startfile("path")
是最好的方法,因为它很小而且有效。这将执行指定的文件。我的python版本是3.x +。
解决方案 17:
当我在python 3中搜索解决方案时,我发现了这一点。在 python 3 中,您只需使用import
函数即可(请注意,py.files 不应该具有与库相同的名称,它应该具有唯一的名称):
文件test1.py:
print "I am a test"
print "see! I do nothing productive."
文件service.py:
import test1
如果你只运行service.py
它将生成输出:
"I am a test"
"see! I do nothing productive."
请注意,它应该位于同一个存储库/文件夹中。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件