2009-07-08 7 views
7

Die Online-documentation besagt, dass os.popen jetzt veraltet ist. Alle anderen veralteten Funktionen verursachen ordnungsgemäß ein DeprecationWarning. Zum Beispiel:Ist os.popen in Python 2.6 wirklich veraltet?

>>> import os 
>>> [c.close() for c in os.popen2('ps h -eo pid:1,command')] 
__main__:1: DeprecationWarning: os.popen2 is deprecated. Use the subprocess module. 
[None, None] 

Die Funktion os.popen, auf der anderen Seite, ergänzt leise:

>>>len(list(os.popen('ps h -eo pid:1,command'))) 
202 

Ohne eine Warnung zu erhöhen. Von den drei möglichen Szenarien

  1. Es wird erwartet, dass die Dokumentation und die Standardbibliothek unterschiedliche Vorstellungen davon haben, was veraltet ist.
  2. Es liegt ein Fehler in der Dokumentation vor und os.popen ist nicht wirklich veraltet;
  3. Es gibt einen Fehler in der Standardbibliothek und os.popen sollte eine Warnung auslösen;

welche ist die richtige?

Hintergrundinformationen, hier ist der Python Ich verwendet:

>>> import sys 
>>> print sys.version 
2.6.2 (r262:71600, May 12 2009, 10:57:01) 
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] 

Das Argument os.popen von einem reply of mine hier auf Stack-Überlauf genommen wird.

Nachtrag: Dank cobbal below stellt sich heraus, dass os.popen in Python 3.1 nicht veraltet ist.

+1

Worauf kommt es an? Warum müssen Sie den "richtigen" Grund wissen? Es wird als veraltet bezeichnet und subprocess.Popen ist der Ersatz. Was müssen Sie noch wissen? Wie verbessert es Ihren Code, um es zu wissen? –

+1

Ich denke, dass tatsächlich sehr viel Code von dieser Funktion abhängt. – liori

+3

Lieber S.Lott, ich weiß, dass es für einen nicht-englischen Muttersprachler nicht immer einfach ist, immer vollkommen klar zu sein, und deshalb entschuldige ich mich, wenn das, was ich schreibe, nicht leicht verständlich ist. Könntest du bitte, bitte bitte, zumindest versuchen, meine Frage zu lesen? Ich frage nicht, was der Grund ist. Ich frage, wer oder was nicht stimmt: die Dokumente, der freigegebene Python-Code oder ich erwarte, dass beide konsistent sind. – krawyoti

Antwort

4

eine Sache, die ich denken kann ist, dass os.popen in python3 existiert, während os.popen2 nicht. So ist man "mehr veraltet" als der andere und für eine frühere Entfernung von der Sprache vorgesehen.

+0

Das ist interessant: nicht nur os.popen ist in Python 3.1 noch vorhanden, aber es ist nicht einmal mehr veraltet. Siehe http://docs.python.org/3.1/library/os.html – krawyoti

5

Hier ist die PEP.

Deprecated modules and functions in the standard library: 

    - buildtools 
    - cfmfile 
    - commands.getstatus() 
    - macostools.touched() 
    - md5 
    - MimeWriter 
    - mimify 
    - popen2, os.popen[234]() 
    - posixfile 
    - sets 
    - sha 
3

In der Zwischenzeit ich eine ticket auf dem Python Issue Tracker geöffnet haben. Ich werde diese Frage offen halten, bis das Ticket geschlossen ist.

+0

Herzlichen Glückwunsch, dass Sie eine so scharfsinnige Frage gestellt haben und dazu beigetragen haben, diese Diskrepanz auf formaler Ebene zu überwinden. Bis jetzt sieht es so aus, als würde Popen bleiben und Dokumentation bekommen. Yay! – nealmcb