2016-07-06 8 views
1

Когда я запускаю скрипт с Ipython в интерактивном режиме, список аргументов sys.argv отличается от интерактивной части исполнения, чем в скрипте.sys.argv отличается в интерактивном режиме в Ipython

Это ошибка, или я делаю что-то неправильно?

Спасибо!

[email protected]:~$ cat test.py 
import sys 
print(sys.argv) 
temp = sys.argv 

[email protected]:~$ ipython -i test.py -- foo bar 
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
Type "copyright", "credits" or "license" for more information. 

IPython 4.2.1 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 
['/home/oskar/test.py', 'foo', 'bar'] 

In [1]: temp 
Out[1]: ['/home/oskar/test.py', 'foo', 'bar'] 

In [2]: sys.argv 
Out[2]: ['/usr/local/bin/ipython', '-i', 'test.py', '--', 'foo', 'bar'] 

ответ

0

Если я просто призываю ipython, и посмотреть на sys.argv я

In [3]: sys.argv 
Out[3]: ['/usr/bin/ipython3'] 

Ваш Out[2] выглядит так же - полный список, как это предусмотрено в скорлупе и интерпретатор Python. Помните, мы проводим сеанс Python с ipython импорта:

#!/usr/bin/env python3 
# This script was automatically generated by setup.py 
if __name__ == '__main__': 
    from IPython import start_ipython 
    start_ipython() 
/usr/bin/ipython3 (END) 

Но посмотрите на ipython -h; в первом абзаце:

он запускает файл и завершает работу, передавая оставшиеся аргументы сценария, так же, как если бы вы указали ту же команды с питоном. Возможно, вам нужно указать --, прежде чем аргументы будут переданы сценарию, чтобы предотвратить попытку IPython их проанализировать.

Так что это явно говорят, что

ipython -i test.py -- foo bar 

становится (в сущности) - или работает как:

python test.py foo bar 

ipython код имеет анализатор (как подкласс argparse), который управляет многими разные аргументы. Но те, с которыми он не справляется, или следуют --, отложены, и положите в sys.argv, что видит ваш test.py.

Но, очевидно, что sys.argv не то, что дается интерактивной сессии.

Я думаю, что вы получите тот же эффект

$ipython 
In[0]: %run test.py foo bar 
... 

%run сохраняет текущий sys.argv и строит новый с sys.argv = [filename] + args. Затем после запуска вашего test.py он восстанавливает sys.argv.

Это не ошибка, и вы не делаете ничего плохого, за исключением того, что два sys.argv должны быть одинаковыми. Похоже, что в простой оболочке Python два sys.argv одинаковы (без каких-либо параметров, которые сама оболочка использует).

 Смежные вопросы

  • Нет связанных вопросов^_^