2010-09-07 13 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 
相關問題