Выполнить python скрипт внутри интерпретатора с аргументами - PullRequest
0 голосов
/ 10 марта 2020

У меня есть скрипт (python3), который выполняется с argparse. Например:

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()

Есть ли способ оставить открытым интерпретатор моей программы после запуска и возможности ввода аргументов программы?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Не самое чистое решение. Вы можете установить sys.argv из вызывающего скрипта:

Допустим, у нас есть foo.py:

import sys

print(sys.argv)

И мы выполняем его так:

import sys

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

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

Получаем:

['arg1', 'arg2']
0 голосов
/ 11 марта 2020

У меня есть небольшой скрипт для вывода 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 имеет различные параметры пространства имен. По умолчанию сценарий запускается в новом пространстве имен, но обновляется интерактив с его значениями.

...