2012-12-29 5 views
33

Ich habe Dokumentation über subprocess.check_output() gefunden, aber ich kann keine mit Argumenten finden und die Dokumentation ist nicht sehr tief. Ich verwende Python 3 (aber ich versuche, ein Python-2-Datei durch Python 3 zu laufen)Wie verwenden Sie subprocess.check_output() in Python?

Ich versuche, diesen Befehl auszuführen: python py2.py -i test.txt

-i ist ein Positions Argument für argparse, test.txt ist was die -i ist, ist py2.py die Datei

ich viele (nicht funktionierenden) Variationen einschließlich versucht haben auszuführen: py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt'])

py2output = subprocess.check_output([str('python'),'py2.py','-i', test.txt'])

+1

Was genau passiert ist, wenn sie nicht funktioniert haben? – khagler

+1

Sie versuchen, eine Python 2-Datei über Python 3 auszuführen? Nein, wird nicht passieren. Python 3 ist absichtlich nicht abwärtskompatibel zu Python 2. Sie müssten '2to3' für * Starter * ausführen, um Ihre Datei in Python 3 zu verwenden. – Makoto

+1

@Makoto: Er versucht, den Python 2-Interpreter innerhalb von a auszuführen Python 3 Skript, das ist völlig in Ordnung. (Und von seiner vorherigen Frage zufällig wissen, dass er es speziell als Workaround für genau die Probleme, die Sie denken, aber das ist hier nicht relevant.) – abarnert

Antwort

45

Die richtige Antwort ist:

py2output = subprocess.check_output(['python','py2.py','-i', 'test.txt']) 

Um zu demonstrieren, hier sind meine zwei Programme:

py2.py:

import sys 
print sys.argv 

py3.py:

import subprocess 
py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt']) 
print('py2 said:', py2output) 

es Laufen :

$ python3 py3.py 
py2 said: b"['py2.py', '-i', 'test.txt']\n" 

Hier ist, was mit jedem Ihrer Versionen falsch:

py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt']) 

Zuerst str('python py2.py') ist genau die gleiche wie 'python py2.py' -Sie ein str nehmen, und rief str es zu einem str zu konvertieren. Dies macht den Code schwerer lesbar, länger und sogar langsamer, ohne dass ein Vorteil entsteht.

Ernsthafter, python py2.py kann kein einzelnes Argument sein, es sei denn, Sie versuchen tatsächlich, ein Programm mit dem Namen, sagen wir /usr/bin/python\ py2.py. Was du nicht bist; Sie versuchen zu laufen, sagen wir /usr/bin/python mit dem ersten Argument py2.py. Sie müssen also die Elemente in der Liste trennen.

Ihre zweite Version behebt das, aber Sie vermissen die ' vor test.txt'. Dies sollte Ihnen eine SyntaxError geben, wahrscheinlich EOL while scanning string literal.

In der Zwischenzeit bin ich nicht sicher, wie Sie Dokumentation gefunden, aber konnte keine Beispiele mit Argumenten finden. Das erste Beispiel ist:

>>> subprocess.check_output(["echo", "Hello World!"]) 
b'Hello World!\n' 

dass der "echo" Befehl mit einem zusätzlichen Argumente aufruft, "Hello World!".

auch:

-i ist ein Positions Argument für argparse, Test.txt ist, was die -i ist

Ich bin mir ziemlich sicher, dass -i ist nicht ein Positions Argument, sondern ein optionales Argument. Ansonsten macht die zweite Hälfte des Satzes keinen Sinn.

+0

jetzt habe ich mit 2 Argumenten in argparse versucht. Ich habe versucht, diesen Befehl in Subprozess zu setzen: 'python py2.py -i test.txt -l ong' Ich habe diesen Subprozess basierend auf Ihrer Antwort versucht:' py2output = subprocess.check_output (["python", "py2.py", "-i", "test.txt", "-l", "ong"]) aber es funktioniert nicht. –

+1

@ user1925847: Was meinst du mit "es funktioniert nicht"? Das ist kein hilfreicher Kommentar. Wenn Sie es richtig machen, funktioniert es - wie meine Antwort zeigt. Offensichtlich hast du etwas falsch gemacht. Aber es ist unmöglich zu erraten, was. Wie ich in einem Kommentar zu der Hauptfrage gesagt habe: Zeige uns deine Skripte, und erzähle uns, was die erwartete und tatsächliche Ausgabe ist, oder es gibt keine Hoffnung zu erraten, was du falsch machst. – abarnert

+1

und vergessen Sie nicht, CalledProcessError ** und ** OSError Ausnahmen zu fangen. –

2

auf dem von @abarnert erwähnt Hinzufügen

ein besseres ist die Ausnahme zu fangen

import subprocess 
try: 
    py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt'],stderr= subprocess.STDOUT) 
    #print('py2 said:', py2output) 
    print "here" 
except subprocess.CalledProcessError as e: 
    print "Calledprocerr" 

diese stderr = subprocess.STDOUT ist sicher für die Herstellung müssen Sie nicht den filenotfound Fehlermeldung erhalten in stderr-das kann nicht in der Regel in falenotfundedexception abgefangen werden, sonst würden Sie am Ende erhalten

Infact eine bessere Lösung dafür wäre, zu überprüfen, ob die Datei/Skripte existieren und dann die Datei/das Skript ausführen

Verwandte Themen