2016-06-25 9 views
-2

Art einer einfachen Frage, aber ich kann nichts in der Nähe meines Problems finden, also hier gehe ich, ich versuche, ein C-Programm in Python auszuführen, um die Ausgabe zu erhalten, ist es ein Problem funktioniert nicht. Ich habe keinen Fehler, aber wenn ich versuche, die Ausgabe zu drucken, bekomme ich einfach nichts, wie eine Leerstelle oder etwas, aber wenn ich drucke, was ausgegeben wird (ist das ein Wort?) In meinem C funktioniert es gut, also hier ist meine python-Code:Ausgabe eines C-Programms in Python erhalten

command = "./serialize %s %s %s" %(binary , width , height) 
p=subprocess.Popen(command, shell=True,stderr=subprocess.STDOUT) 
(output, err) = p.communicate() 
print output 

(ziemlich geradlinig, binär ist ein String und Breite und Höhe sind ganze Zahlen)

und wenn Sie wissen wollen, hier ist mein C-Code:

char* main(char* argc,char* argv[]){ 
char* r; 
r = serialize(argv[1],atoi(argv[2]),atoi(argv[3])); 
printf("%s", r); 
return r; 
} 

(Serialisierung ist eine Funktion, die ich gemacht habe, die völlig in Ordnung funktioniert, weiß ich wegen der pr Intf kurz vor der Rückkehr, die mir geben was ich will).

Also, wenn Sie irgendeine Idee haben, die großartig wäre, vielen Dank.

Antwort

-1

Zwei Themen hier:

  • Popen nimmt eine Liste der Argumente, kein String. Das passiert, wenn shell=True eine schlechte Sicherheitsgefahr ist. Stellen Sie sich vor, wenn width gleich ; rm -rf / ist.
  • Der Rückgabewert ist ein spezielles Objekt, das Informationen über den Prozess unter enthält. Popen wartet nicht auf die Rückkehr des Prozesses.

Versuchen:

command = ['./serialize', binary, str(width), str(height)] 
stdout, stderr = subprocess.check_output(command) 
print stdout, stderr 

Wenn Sie sowohl stdout und stderr wollen in einer Zeichenfolge, tun:

output = subprocess.check_output(command, stderr=subprocess.STDOUT) 

Ihre C-Code ist auch falsch. main sollte eine int mit dem Prozess Return-Code (0 in diesem Fall) zurückgeben, und Sie können puts(r) anstelle von printf verwenden. Es wird auch heftig zum Absturz gebracht, wenn Sie weniger als 3 Argumente übergeben. Darüber hinaus ist argc auch ein int. Versuchen Sie so etwas wie:

int main(int argc, char** argv) { 
    char* r; 
    if (argc < 4) { 
     puts("Too few arguments"); 
     return 1; 
    } 
    r = serialize(argv[1],atoi(argv[2]),atoi(argv[3])); 
    puts(r); 
    return 0; 
} 
+0

habe gerade versucht, aber ich habe einen Fehler, hier die Zurückverfolgungs: Traceback (jüngste Aufforderung zuletzt): File "testsql.py", Zeile 77, in stdout, stderr = subprocess.check_output (command) Datei "/usr/lib/python2.7/subprocess.py", Zeile 567, in check_output Prozess = Popen (stdout = PIPE, * popenargs, ** kwargs) Datei "/ usr /lib/python2.7/subprocess.py ", Zeile 711, in __init__ errread, errrite) Datei" /usr/lib/python2.7/subprocess.py ", Zeile 1340, in _execute_child raise child_exception TypeError: execv() arg 2 darf nur Strings enthalten –

+0

@DrunkenChoko Sind 'width' und' height' ganze Zahlen? Ich glaube es; Ich habe die Antwort aktualisiert. – refi64

+0

Argh, nun, neuer Tag, neuer Fehler, gab einen Nicht-Null-Exit-Status 32 zurück, es ist ziemlich hässlich, würde ich sagen. –