【问题标题】:Execute python script within the interpreter, with arguments在解释器中执行 python 脚本,带参数
【发布时间】:2020-06-22 19:57:10
【问题描述】:

我有一个使用argparse 执行的 (python3) 脚本。例如:

my_program.py arg0 arg1 arg2=foo

出于调试目的,我希望脚本能够执行并将我留在一个开放的解释器会话中。在 python 解释器中调用脚本的常用方法对我不起作用。例如:

# How to input the program arguments? (arg0 arg1 arg2=foo)
exec(open("my_program.py").read())
# How to inherit the interpreter variables once the program has finished executing?
import subprocess
subprocess.call(["my_program.py", "arg0", "arg1", "arg2=foo"])
# How to input the program arguments? (arg0 arg1 arg2=foo)
import my_program
my_program.main()

在运行并能够输入程序参数后,有没有办法让我的程序的解释器保持打开状态?

【问题讨论】:

  • 为什么不使用普通的调试器,比如 pdb 或者 pycharm 调试器?
  • 这可能是一个解决方案。我只是对探索结果、导入其他库和操作对象感兴趣,而不是单步执行代码。所以这看起来更自然。

标签: python-3.x argparse


【解决方案1】:

不是最干净的解决方案。您可以从调用脚本中设置sys.argv

假设我们有foo.py:

import sys

print(sys.argv)

我们像这样执行它:

import sys

sys.argv = ["arg1", "arg2"]

exec(open('foo.py').read())

我们得到:

['arg1', 'arg2']

【讨论】:

    【解决方案2】:

    我有一个小脚本来回显sys.argv(用于调试argparse 的输入):

    2303:~/mypy$ cat echo.py
    import sys
    print(sys.argv)
    

    如果我使用 python '-i' 选项运行它,我将留在解释器会话中,sys 可用:

    2303:~/mypy$ python3 -i echo.py foo bar
    ['echo.py', 'foo', 'bar']
    >>> sys.argv
    ['echo.py', 'foo', 'bar']
    >>> 
    <exit>
    

    或者使用argparse的简单脚本:

    import argparse
    p = argparse.ArgumentParser()
    p.add_argument('-p')
    p.add_argument('foo')
    args = p.parse_args()
    print(args)
    

    使用“-i”运行:

    2313:~/mypy$ python3 -i stack60625769.py -p foo bar
    Namespace(foo='bar', p='foo')
    >>> p
    ArgumentParser(prog='stack60625769.py', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
    >>> args
    Namespace(foo='bar', p='foo')
    >>> 
    

    我通常在ipython 会话中工作。从那里我可以%run 一个脚本:

    2312:~/mypy$ inumpy3
    Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
    Type 'copyright', 'credits' or 'license' for more information
    IPython 7.11.1 -- An enhanced Interactive Python. Type '?' for help.
    In [1]: %run stack60625769.py -p foo bar                                                        
    Namespace(foo='bar', p='foo')
    In [2]: args                                                                                   
    Out[2]: Namespace(foo='bar', p='foo')
    In [3]: p                                                                                      
    Out[3]: ArgumentParser(prog='stack60625769.py', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
    

    我可以使用自定义 argv 再次运行该解析器(不是启动 ipython 会话的那个:

    In [9]: p.parse_args('foo -p bar'.split())                                                     
    Out[9]: Namespace(foo='foo', p='bar')
    

    %run 有多种命名空间选项。默认是在一个新的命名空间中运行脚本,但是用它的值更新交互式。

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多