我有一个名为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

我知道有一种方法是打开文件,读取内容,然后对它求值。我想应该有更好的方法。至少我希望如此。


当前回答

I found runpy standard library most convenient. Why? You have to consider case when error raised in test1.py script, and with runpy you are able to handle this in service.py code. Both traceback text (to write error in log file for future investigation) and error object (to handle error depends on its type): when with subprocess library I wasn't able to promote error object from test1.py to service.py, only traceback output. Also, comparing to "import test1.py as a module" solution, runpy is better cause you have no need to wrap code of test1.py into def main(): function.

代码片段为例,使用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)

其他回答

为什么不直接导入test1?每个python脚本都是一个模块。更好的方法是在test1.py中添加一个函数main/run,导入test1并运行test1.main()。或者可以将test1.py作为子进程执行。

第一次使用import test1 -它将执行脚本。对于以后的调用,将脚本视为导入的模块,并调用reload(test1)方法。

当reload(module)执行时: Python模块的代码被重新编译,模块级代码被重新执行,定义一组新的对象,这些对象被绑定到模块字典中的名称。扩展模块的init函数没有被调用

一个简单的检查sys。模块可用于调用适当的操作。要继续将脚本名称引用为字符串('test1'),请使用内置的'import()'。

import sys
if sys.modules.has_key['test1']:
    reload(sys.modules['test1'])
else:
    __import__('test1')

这可以在Python 2中使用

execfile("test2.py")

如果对您的情况很重要,请参阅文档了解名称空间的处理。

在Python 3中,可以使用(感谢@fantastory)

exec(open("test2.py").read())

然而,你应该考虑使用不同的方法;(在我看来)你的想法不太清楚。

正如前面提到的,runpy是运行当前脚本中的其他脚本或模块的好方法。

顺便说一下,跟踪器或调试器通常会这样做,在这种情况下,直接导入文件或在子进程中运行文件等方法通常是行不通的。

使用exec运行代码也需要注意。您必须提供适当的run_globals以避免导入错误或其他问题。参考runpy。查看详细信息_run_code。

这个过程有点非传统,但适用于所有的python版本,

假设你想在一个'if'条件中执行一个名为' recommendation .py'的脚本,然后使用,

if condition:
       import recommend

技术是不同的,但有效!