2016-08-09 12 views
0

Ich versuche, ein Befehlszeilenskript auszuführen. ich habe: command.pyPython ausführen Befehlszeile

import subprocess 
proc = subprocess.Popen('python3 hello.py', stdout=subprocess.PIPE) 
tmp = proc.stdout.read() 
print(tmp) 

und hello.py

print("hello") 

aber es gibt Fehler

FileNotFoundError: [WinError 2]

Wie kann ich das Kommando und Druckergebnis führen?

Antwort

1

Das Problem ist, dass Popenpython3 in Ihrem Pfad nicht finden kann.

Wenn der primäre Fehler war, dass hello.py nicht gefunden wurde, würde diese Fehler hat stattdessen in stderr (das wird nicht gelesen)

python: can't open file 'hello.py': [Errno 2] No such file or directory 

Sie würden nicht eine Ausnahme in subprocess bekommen, weil python3 hat laufen, aber konnte die auszuführende Python-Datei nicht finden.

Erstens, wenn Sie eine Python-Datei ausführen möchten, ist es besser, es in einem anderen Prozess auszuführen.

Aber wenn Sie das immer noch tun möchten, ist es besser, es mit einer Argumentliste wie dieser auszuführen, damit Leerzeichen richtig behandelt werden und den vollständigen Pfad zu allen Dateien angeben.

import subprocess 
proc = subprocess.Popen([r'c:\some_dir\python3',r'd:\full_path_to\hello.py'], stdout=subprocess.PIPE) 
tmp = proc.stdout.read() 
print(tmp) 

Um weiter zu gehen:

  • Für python3, es wäre gut, es im Systempfad setzen Sie den vollständigen Pfad zu vermeiden, angeben.

    import subprocess,os 
    basedir = os.path.dirname(__file__) 
    proc = subprocess.Popen(['python3',os.path.join(basedir,'hello.py')], stdout=subprocess.PIPE) 
    tmp = proc.stdout.read() 
    print(tmp) 
    

    auch::

  • wie für das Skript, wenn es sich befindet, sagen wir, im selben Verzeichnis und das aktuelle Skript, können Sie den Pfad

verbesserte Code-Schnipsel zu codieren vermeiden Popen führt eine Art execvp des ersten übergebenen Arguments aus. Wenn das erste übergebene Argument beispielsweise eine .bat Datei ist, müssen Sie das cmd /c Präfix oder shell=True hinzufügen, um Popen mitzuteilen, dass der Prozess in einer Shell statt dessen direkt ausgeführt werden soll.

+0

ok, seine Arbeit für meine, ABER , warum, wenn ich laufe proc = subprocess.Popen ([ 'casperjs', os.path.join (basedir, 'casper_script.js')], stdout = subprocess.PIPE) sein Rückkehrfehler – ivan

+0

capserjs ist installieren – ivan

+0

im lösen Problem, wenn addieren "shell = True" – ivan

Verwandte Themen