簡體   English   中英

如何從腳本執行另一個python腳本並能夠調試?

[英]How to execute another python script from your script and be able to debug?

你有一個調用另一個python腳本的包裝python腳本,目前正在使用os.system('python another.py some-params')

您希望能夠調試這兩個腳本,如果使用os.system() ,則會松開調試器,因此使用相同的解釋器加載第二個腳本而不是啟動另一個腳本是有意義的。

import不符合預期的事情,因為它不運行__main__

其他變體,如exec()runpy接縫錯過argv參數。

你對這個問題有什么解決方案?

我正在尋找一個不需要你修改another.py腳本的解決方案。 可能這需要在執行之前修改sys.argv

到目前為止,我發現了一個僅適用於Python 2.7+的解決方案(在Python 2.7中引入了runpy.run_path())。

如果您能找到一個適用於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

你有控制another.py 更改它並添加main()方法是個好主意。 if __name__ == '__main__'則可以調用Main() 這將大大緩解您的問題。 它也是單元測試友好的。

基於從EOL收到的建議,我對execfile()進行了擴展,確實解決了它的局限性execfile2()

以下是代碼,但新版本將在此處發布。 它向后兼容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

您可以將主塊調用為函數。 這樣,您可以在導入模塊時調用相同的功能。

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

if __name__ == "__main__":
    main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM