我有一个名为test1.py的脚本,它不在模块中。它只有在脚本本身运行时才能执行的代码。没有函数,类,方法等。我有另一个作为服务运行的脚本。我想从作为服务运行的脚本中调用test1.py。
例如:
print "I am a test"
print "see! I do nothing productive."
# Lots of stuff here
test1.py # do whatever is in test1.py
我知道一种方法是打开文件,读取内容,并基本上评估它。我假设有一个更好的方法来做到这一点。或者至少我希望如此。
答案 0 :(得分:236)
执行此操作的常用方法如下所示。
test1.py
def some_func():
print 'in test 1, unproductive'
if __name__ == '__main__':
# test1.py executed as script
# do something
some_func()
service.py
import test1
def service_func():
print 'service func'
if __name__ == '__main__':
# service.py executed as script
# do something
service_func()
test1.some_func()
答案 1 :(得分:117)
这可以在Python 2中使用
execfile("test2.py")
如果您的情况很重要,请参阅documentation以了解名称空间的处理。
在Python 3中,这可以使用(感谢@fantastory)
exec(open("test2.py").read());
但是,您应该考虑使用不同的方法;你的想法(从我所看到的)看起来不太干净。
答案 2 :(得分:58)
另一种方式:
print "test1.py"
import subprocess
subprocess.call("test1.py", shell=True)
此方法的优点是您无需编辑现有的Python脚本即可将其所有代码放入子例程中。
答案 3 :(得分:18)
如果你希望test1.py保持可执行的功能与在service.py中调用它时的功能相同,那么执行以下操作:
test1.py
def main():
print "I am a test"
print "see! I do nothing productive."
if __name__ == "__main__":
main()
service.py
import test1
# lots of stuff here
test1.main() # do whatever is in test1.py
答案 4 :(得分:10)
你不应该这样做。相反,做:
test1.py:
def print_test():
print "I am a test"
print "see! I do nothing productive."
service.py
#near the top
from test1 import print_test
#lots of stuff here
print_test()
答案 5 :(得分:7)
首次使用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')
答案 6 :(得分:6)
import os
os.system("python myOtherScript.py arg1 arg2 arg3")
使用操作系统,您可以直接拨打终端电话。如果您想要更具体,可以将输入字符串与局部变量连接起来,即
command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)
答案 7 :(得分:2)
为什么不直接导入test1?每个python脚本都是一个模块。更好的方法是拥有一个功能,例如main / run in test1.py,import test1并运行test1.main()。或者您可以将test1.py作为子进程执行。
答案 8 :(得分:1)
这是subprocess
库的示例:
import subprocess
python_version = '3'
path_to_run = './'
py_name = '__main__.py'
# args = [f"python{python_version}", f"{path_to_run}{py_name}"] # Avaible 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_)
答案 9 :(得分:1)
我更喜欢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')
答案 10 :(得分:0)
正如已经提到的,runpy
是从当前脚本运行其他脚本或模块的好方法。
顺便说一句,跟踪器或调试器通常会这样做,并且在这种情况下,直接导入文件或在子进程中运行文件之类的方法通常不起作用。
使用exec
运行代码也需要注意。您必须提供正确的run_globals
以避免导入错误或其他一些问题。有关详细信息,请参见runpy._run_code
。
答案 11 :(得分:0)
此过程有些不合常规,但可以在所有python版本中使用,
假设您要在“ if”条件下执行名为“ recommend.py”的脚本,然后使用
if condition:
import recommend
技术不同,但是有效!
答案 12 :(得分:0)
将此添加到您的python脚本中。
import os
os.system("exec /path/to/another/script")
这将执行该命令,就像将其键入到shell中一样。
答案 13 :(得分:0)
一个使用子进程的例子。
from subprocess import run
import sys
run([sys.executable, 'fullpathofyourfile.py'])
答案 14 :(得分:-1)
我在http://hplgit.github.io/primer.html/doc/pub/tech/._tech-solarized012.html上发现了这个简单的示例,即使您需要指定多个参数,也可以从另一个内部调用一个python脚本
import subprocess
cmd = 'python train_frcnn.py --input_weight_path model_frcnn.hdf5 -o simple -p take2.csv'
subprocess.call(cmd, shell=True)