从另一个脚本调用脚本的最佳方法是什么?

时间:2009-07-27 06:52:48

标签: python

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

我知道一种方法是打开文件,读取内容,并基本上评估它。我假设有一个更好的方法来做到这一点。或者至少我希望如此。

15 个答案:

答案 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)

另一种方式:

文件test1.py:

print "test1.py"

文件service.py:

import subprocess

subprocess.call("test1.py", shell=True)

此方法的优点是您无需编辑现有的Python脚本即可将其所有代码放入子例程中。

文档:Python 2Python 3

答案 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)