2010-09-07 28 views
4

你有包装python脚本调用另一个python脚本,目前使用os.system('python another.py some-params')如何从你的脚本执行另一个python脚本并且能够调试?

您希望能够对两个脚本进行调试,并且如果您使用os.system()则会丢失调试器,因此使用同一个解释器加载第二个脚本而不是启动另一个脚本是有意义的。

import不符合预期的事情,因为它不运行__main__

其他变体,如exec()runpy接缝错过argv参数。

你看到这个问题的解决方案是什么?

我正在寻找一个不需要您修改another.py脚本的解决方案。在执行它之前,可能需要修改sys.argv

+1

在非解决方案中,您还有'execfile()',这在其他情况下可能很有用。 – EOL 2010-09-07 14:44:13

+0

我忘记了'execfile()',我会测试它是否运行'__main__',这是非常重要的。 – sorin 2010-09-07 20:09:35

回答

2

基于从EOL接收到的推荐,我做了一个扩展execfile(),它解决它的局限性execfile2()

下面是代码,但新的版本将公布here。它向后兼容execfile()

def execfile2(filename, _globals=dict(), _locals=dict(), cmd=None, quiet=False): 
    _globals['__name__']='__main__' 
    saved_argv = sys.argv # we save sys.argv 
    if cmd: 
    sys.argv=list([filename]) 
      if isinstance(cmd , list): 
       sys.argv.append(cmd) 
      else: 
       sys.argv.extend(shlex.split(cmd)) 
    exit_code = 0 
try: 
     execfile(filename, _globals, _locals) 
    except SystemExit as e: 
     if isinstance(e.code , int): 
      exit_code = e.code # this could be 0 if you do sys.exit(0) 
     else: 
      exit_code = 1 
    except Exception: 
     if not quiet: 
      import traceback 
      traceback.print_exc(file=sys.stderr) 
     exit_code = 1 
    finally: 
     if cmd: 
      sys.argv = saved_argv # we restore sys.argv 
    return exit_code 
+0

你的代码行'saved_argv = sys.argv#我们保存sys.argv'不正确。也许你的意思是复制列表:'saved_argv = sys.argv [:]' – 2015-05-11 23:44:26

2

你有控制another.py吗?改变它并添加一个main()方法是一个好主意。然后可以调用Main()if __name__ == '__main__'。这将大大减轻你的问题。它也是单元测试友好的。

1

您可以使主块调用一个函数。通过这种方式,您可以在作为模块导入时调用相同的功能。

def main(): 
    print "All start up commands" 

if __name__ == "__main__": 
    main() 
6

到目前为止,我发现,只有与Python 2.7+作品(runpy.run_path()在Python 2.7中引入)的解决方案。

如果你可以找到一个与2.6(甚至2.5)的作品,欢迎您发布它。

import runpy, sys 
saved_argv = sys.argv 
... # patch sys.argv[1:] and load new command line parameters 
# run_path() does change only sys.argv[0] but restores it 
runpy.run_path('another.py', run_name="__main__") 
sys.argv = saved_argv # restore sys.argv 
相关问题