[英]How to execute a local python script into a docker from another python script?
[英]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.