2016-06-20 5 views
1

Dies ist ein einfacher Befehl, der von der Kommandozeile arbeitet:Keine Ausgabe von Kind mit subprocess ausgeführt Python

> python -c "print('asdasd')" 
asdasd 

Aber es nicht zu irgendetwas ausgegeben wird, wenn aus dem Skript ausgeführt:

import os 
import sys 
import subprocess 

cmd = [sys.executable] + ['-c', '"print(\'asdasd\')"'] 
print cmd 
kwargs = { 
    'stdout': subprocess.PIPE, 
    'stderr': subprocess.PIPE, 
    'stdin': subprocess.PIPE, 
} 

print subprocess.Popen(cmd).communicate() 
print subprocess.Popen(cmd, **kwargs).communicate() 

Der Ausgang :

Warum produziert es nichts? Ich habe keine Ideen mehr. Sieht für mich wie ein Fehler in Python 2.7.11 aus.

Antwort

1

Zuerst brauchen Sie diese zusätzlichen Anführungszeichen für '"print(\'asdasd\')"' in Ihren Befehlszeilenargumenten nicht. So wie es ist, wird Ihr Code nur einen Python-Code ausführen, der folgendes ausführt: "print(\'asdasd\')". Mit anderen Worten, es wird die Zeichenkette erzeugt: print (\ 'asdasd \')

Offensichtlich wird beim Erstellen einer Zeichenkette nichts gedruckt. Hier ist eine gepatchte Version des Codes:

import os 
import sys 
import subprocess 

cmd = [sys.executable] + ['-c', 'print(\'asdasd\')'] 
print cmd 
kwargs = { 
    'stdout': subprocess.PIPE, 
    'stderr': subprocess.PIPE, 
    'stdin': subprocess.PIPE, 
} 

print subprocess.Popen(cmd).communicate() 
print subprocess.Popen(cmd, **kwargs).communicate() 

Sie können das shlex Modul benutzen, um Ihre Befehlszeilenargument zu analysieren.

Zum Beispiel des shlex Modul und die dreifachen Anführungszeichen mit einem String-Format (keine Anführungszeichen für den Python-Pfad vergessen, sonst Zeichen wie Backslash werden interpretiert werden): Diese

import sys 
import shlex 
import subprocess 

cmd_str = '''"{}" -c "print('asdasd')"'''.format(sys.executable) 
print(cmd_str) 
cmd = shlex.split(cmd_str) 
print(cmd) 
kwargs = { 
    'stdout': subprocess.PIPE, 
    'stderr': subprocess.PIPE, 
    'stdin': subprocess.PIPE, 
} 
print(subprocess.Popen(cmd).communicate()) 
print(subprocess.Popen(cmd, **kwargs).communicate()) 
+0

Danke! Ich wusste, dass etwas offensichtlich ist, aber ich dachte, es wäre irgendwo im "Subprozess". Ich habe den String zitiert, weil er in der rohen Befehlszeile zitiert wurde, aber wenn Argumente in einer Liste ausgedrückt werden, zitiert Python sie selbst. –

0

Versuchen:

subprocess.Popen(['{} -c "print(\'ECHO\')"'.format(sys.executable)], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 
+0

Funktioniert nicht. Hat es für dich funktioniert? –

+0

@anatolytechtonik Bearbeitet, versuchen Sie es noch einmal. – j4hangir