2016-03-07 29 views
2

我們如何啓動ipython REPL並指示它將一些命令行參數傳遞給底層python解釋器?在ipython中發送python命令行參數

例如,我們可以通過使用

python -v 

打開增加冗長蟒蛇REPL但我看不出如何打開IPython中時,通過傳遞標誌。

+1

在緊要關頭,你可以使用[環境變量](https://docs.pyth例如on.org/3/using/cmdline.html#environment-variables)。 'PYTHONVERBOSE'。 –

回答

5

我會說這樣做將明確推出ipython與蟒蛇的最佳方式:

python /usr/bin/ipython 

ipython可執行文件僅僅是一個python腳本;或者你可以告訴巨蟒加載ipython庫推出ipython

python -m IPython.frontend.terminal.ipapp 

,然後你可以添加所有的原生的Python參數:

python -v /usr/bin/ipython 
python -v -m IPython.frontend.terminal.ipapp 

HTH

+0

它不漂亮,但它的工作。謝謝! – wim

+1

沒有辦法做到這一點,事實是,我沒有使用'ipython',因爲我認爲一個配置良好(帶有完成和幫助)的vanilla python REPL非常好,而且正是要運行代碼的東西我正在使用它,所以沒有意外,腳本和REPL之間沒有區別。從我的角度來看,ipython只是一種無法在有時變得相當醜陋的黑客☺ – zmo

+0

在我看來,這只是一個shebang腳本問題。直接調用腳本時,解釋器不使用'sys.argv'。 – hpaulj

0

-v選項影響的行爲的翻譯本身,而不僅僅是REPL。無論您是否添加-i選項,都可以獲得額外的導入信息。

這裏的默認腳本啓動ipython(或至少一個的那個版本)

1522:~/mypy$ cat /usr/local/bin/ipython3.5 
#!/usr/local/bin/python3.5 

# -*- coding: utf-8 -*- 
import re 
import sys 

from IPython import start_ipython 

if __name__ == '__main__': 
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) 
    sys.exit(start_ipython()) 

,並從IPython的會話中:

In [1153]: from IPython import start_ipython 
In [1154]: start_ipython?? 
String form: <function start_ipython at 0xb697edac> 
File:  /usr/lib/python3/dist-packages/IPython/__init__.py 
Definition: start_ipython(argv=None, **kwargs) 
Source: 
def start_ipython(argv=None, **kwargs): 
    "..." 
    from IPython.terminal.ipapp import launch_new_instance 
    return launch_new_instance(argv=argv, **kwargs) 

最終,argv被傳遞到​​解析器。 Ipython使用從其配置文件派生的參數填充該解析器。因此,您有幾個設置參數的選項 - 默認配置,配置文件配置和命令行。但所有這些都是在口譯員啓動之後。有些事情的行爲與解釋器REPL相同,但不是全部(-m,但不是-v)。

當使用-v作爲zmo建議時,我們看到ipython代碼的所有進口 - 這是很多的代碼。你對這些感興趣嗎?還是你對與自己的腳本相關的進口產品更感興趣?

我用ipython很多來測試答案,特別是對於numpy。實際上,我的默認ipython呼叫有--pylab標誌。但爲了測試獨立腳本,我使用普通的python(通常從我的編輯器中的終端窗口調用)。有時候,雖然我會%runipython的腳本。將模塊加載到主工作區中,可以輕鬆地對功能執行%timeit測試。


其他ipython腳本使用

#!/usr/bin/python 
import sys 
from pkg_resources import load_entry_point 
if __name__ == '__main__': 
    sys.exit(
     load_entry_point(...) 

我不使用這種風格編寫很多代碼,但我看不出那樣的啓動可以通過傳遞argv來解釋。在模塊加載並開始運行時,解釋器已經在運行。

一般來說,它看起來像ipython處理基本相同的方式作爲常規python-i-m-c選項。它可以用自己的代碼來做,而不是委託給口譯員。但是像-v,-O,-t這樣的東西適用於解釋器,而不是REPL,並且不是由ipython代碼來處理。

1

你可以自己編寫ipython shebang腳本。

在這裏,我抄我的ipython腳本,並添加了-v

#!/usr/local/bin/python3.5 -v 

# -*- coding: utf-8 -*- 
import re 
import sys 

from IPython import start_ipython 

if __name__ == '__main__': 
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) 
    sys.exit(start_ipython()) 

現在,當我執行./vipython我得到在啓動和關閉的import信息的網頁。

我從其他SO問題收集我可能無法將多個選項添加到這樣一個shebang行。

How to use multiple arguments with a shebang (i.e. #!)?

因此,例如

#!/usr/local/bin/python3.5 -vv 

作品,但

#!/usr/local/bin/python3.5 -v -v 

沒有 - 它給了我

1008:~/mypy$ ./vipython 
Unknown option: - 
usage: /usr/local/bin/python3.5 [option] ... [-c cmd | -m mod | file | -] [arg] ... 
Try `python -h' for more information.