从另一个python脚本执行python脚本

时间:2011-10-14 03:15:05

标签: python

我有一个脚本a.py:

#!/usr/bin/env python

def foo(arg1, arg2):
    return int(arg1) + int(arg2)

if __name__ == "__main__":
   import sys
   print foo(sys.argv[1], sys.argv[2])`

我现在想制作一个可以运行第一个脚本并将a.py的输出写入带有一些参数的文件的脚本。我想让automate_output(src,arglist)生成一些我可以写入outfile的输出:

import sys

def automate_output(src,  arglist):
    return ""


def print_to_file (src, outfile, arglist):
    print "printing to file %s" %(outfile)
    out = open(outfile, 'w')
    s = open(src, 'r')

    for line in s:
        out.write(line)
    s.close()

    out.write(" \"\"\"\n Run time example: \n") 
    out.write(automate(src, arglist))
    out.write(" \"\"\"\n")
    out.close()


try: 
    src = sys.argv[1]
    outfile = sys.argv[2]
    arglist = sys.argv[3:]
    automate(src, arglist)
    print_to_file(src,outfile,arglist)  
except:
    print "error"
    #print "usage : python automate_runtime.py scriptname outfile args"

我尝试过搜索,但到目前为止,我不明白如何通过使用带参数的os.system来传递参数。我也尝试过:

import a
a.main()

我得到一个NameError:名称'main'未定义

更新: 我研究了一些,发现了子进程,我现在看起来非常接近破解它。 以下代码确实有效,但我想传递args而不是手动传递'2'和'3'     src ='bar.py'     args =('2','3')
    proc = subprocess.Popen(['python',src,'2','3'],stdout = subprocess.PIPE,stderr = subprocess.STDOUT)     print proc.communicate()[0]

2 个答案:

答案 0 :(得分:1)

a.main()if __name__=="__main__"阻止无关。前者从main()模块调用名为a的函数,后者在当前模块名称为__main__时执行其块,即,当模块作为脚本调用时。

#!/usr/bin/env python
# a.py
def func():
    print repr(__name__)

if __name__=="__main__":
    print "as a script",
    func()

比较作为脚本执行的模块和从导入的模块调用的函数:

$ python a.py
as a script '__main__'

$ python -c "import a; print 'via import',; a.func()"
via import 'a'

请参阅section Modules in the Python tutorial

要从子流程获取输出,您可以使用subprocess.check_output()函数:

import sys
from subprocess import check_output as qx

args = ['2', '3']
output = qx([sys.executable, 'bar.py'] + args)
print output

答案 1 :(得分:1)

这不是一个函数,它是一个if语句:

if __name__ == "__main__":
    ...

如果你想要一个主要功能,请定义一个:

import sys

def main():
   print foo(sys.argv[1], sys.argv[2])`

如果您需要,请调用它:

if __name__ == "__main__":
    main()