2013-08-24 14 views
11

Biraz sıra dışı bir durumla karşılaştım. Ben senaryoya (öğretme/test amaçlı) interaktif konsolu çalışıyorum ve aşağıdaki çalıştı:Python'un interaktif istemi ">>>" çıktı?

$ python > /dev/null 
Python 2.7.3 (v2.7.3:70274d53c1dd, Apr 9 2012, 20:52:43) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print 3 
>>> 

3 baskılı değildir, bu yüzden açıkça her şey stderr oldu. Çok uzak çok iyi. Ama sonra stderr yönlendirmek:

$ python 2> /dev/null 
>>> print 3 
3 
>>> 

nasıl istemi her iki durumda da basılabilir?

DÜZENLEME: Hem stdout hem de stderr öğelerini yeniden yönlendirmek, yazdırılacak hiçbir şey yapılmamasına neden olur. Yani Python açıkça stdout veya stderr'dan birini seçerek "seçiyor". Bu belgelenecek mi? Bunun aslında Python kaynak kodunda nasıl yapıldığını anlayamadım.

+2

Huh, bu garip. Belki de isatty'yi kontrol eder? – delnan

+0

Bu benim tahminim olurdu, ama Python'un aslında bunu nerede yaptığını anlayamıyorum. En garip olan şey, PyOS_StdioReadline'ın, okuma girişinden sorumlu gibi görünen fonksiyonun, 'stderr' komutunu yazdırmak için kodlanmış olmasıdır. Stderr 'stdout' öğesine yönlendirildiyse, ikinci örnekte de belirtildiği gibi, banner'ı görmeliyiz. – nneonneo

+1

[Ipython'un dizüstü bilgisayar özelliği] (http://ipython.org/notebook.html) gibi, Python öğretmek için tasarlanmış bir araç kullanmak daha kolay olabilir. –

cevap

4

O stdout bir tty olup olmadığını piton çekleri gibi görünüyor: çizgi etrafında Parser/myreadline.c den

/* This is needed to handle the unlikely case that the 
* interpreter is in interactive mode *and* stdin/out are not 
* a tty. This can happen, for example if python is run like 
* this: python -i < test1.py 
*/ 
if (!isatty (fileno (sys_stdin)) || !isatty (fileno (sys_stdout))) 
    rv = PyOS_StdioReadline (sys_stdin, sys_stdout, prompt); 
else 
    rv = (*PyOS_ReadlineFunctionPointer)(sys_stdin, sys_stdout, 
             prompt); 

Sourcecode 194.

O tercüman başlangıçta readline modülü ithal olması mümkün, bu durumda PyOS_ReadlineFunctionPointer olacak içinde readline kitaplığını kullanan call_readline olarak ayarlanmış. Özellikle rl_callback_handler_install'u çağırır. Bu işlevin belgelendirmesi, istemin yazdırıldığı yeri belirtmez, ancak stdout/stderr'un tty s olup olmadığını kontrol etmesi olasıdır.

+0

Bunun üzerinde, bununla birlikte, PyOS_ReadlineFunctionPointer'ı 'PyOS_StdioReadline' olarak ayarlamış gibi görünüyor (kesinlikle açık olmayan VMS hariç). – nneonneo

+0

@nneonneo Evet, biraz şaşırdım, ama gördüğüm davranışları bir şekilde açıklayabildiğim tek referans bu. Okuyucu kütüphanesi var mı? Çünkü dosyanın başında, kullanılabilir olduğunda onu kullandığını belirtiyor. – Bakuriu

+0

@nneonneo Sadece "NULL" değilse ayarlar. Eğer tercüman başlatma sırasında 'readline'ı içeriyorsa,' readline' modülü fonksiyonunu ayarlayacaktır (“Modules/readline.c''deki init fonksiyonuna bakınız)” ve “PyOS_Readline” 'PyOS_StdioReadline' kullanılmayacaktır. – Bakuriu