Mit einem Python-subprocess aufrufen zum aufrufen eines Python-Skript
Habe ich ein Python-script, das muss ein anderes aufrufen, Python script in das gleiche Verzeichnis. Ich habe diese:
from subprocess import call
call('somescript.py')
Bekomme ich die folgende Fehlermeldung:
call('somescript.py')
File "/usr/lib/python2.6/subprocess.py", line 480, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Ich habe das Skript somescript.py im gleichen Ordner obwohl. Bin ich hier etwas fehlt?
- Ist
.
in IhremPATH
? Ist somescript.py ausführbare Datei? - Warum sind Sie versuchen zu erfüllen? warum nicht
import
es? - ja. Es ist im Pfad und ausführbare Datei zu. Ja. Konnte ich auch importieren. Aber würde eitherway gerne wissen, was mache ich hier falsch, da ich denke, dass dies funktionieren soll.
- Warum nicht importieren?! Viele Gründe: wirklich ausführen, auch wenn bereits importiert; haben
__name__ == '__main__
; mehrfach ausgeführt werden. - Auch: wenn ' s nicht Python 2, und das andere Skript im gleichen Verzeichnis, wird es nicht einfach importieren. Möglicherweise müssen Sie fügen Sie Ihrem Verzeichnis zu
sys.path
, die Sie nicht wollen, zu tun, aus vielen Gründen: Sicherheit unter Ihnen (name-clashes...).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn 'somescript.py' ist nicht etwas, Sie könnten in der Regel ausgeführt werden soll, direkt von der Befehlszeile aus (I. e.,
$: somescript.py
funktioniert), dann kann man nicht direkt aufrufen mit call.Denken Sie daran, dass die Art und Weise Popen funktioniert, ist, dass das erste argument ist das Programm, das Sie ausführt, und der rest sind die Argumente für das Programm. In diesem Fall, das Programm ist eigentlich python, nicht dein script. So werden die folgenden arbeiten, wie Sie es erwarten:
Richtig ruft den Python-interpreter und sagt, es führen Sie Ihr Skript mit den gegebenen Argumenten.
Beachten Sie, dass dies unterscheidet sich von den oben genannten Vorschlag:
Die versuchen werden, führen Sie das Programm aufgerufen python somscript.py, die eindeutig nicht vorhanden ist.
Funktioniert auch, aber mit strings als Eingabe zu nennen, ist nicht cross-Plattform, ist gefährlich, wenn Sie nicht der Aufbau der Zeichenfolge, und sollte im Allgemeinen vermieden werden, wenn überhaupt möglich.
run()
stattcall()
.python
- ist es auf Ihrem Weg? Wird es den gleichen interpreter, die Sie unter?'python'
zusys.executable
(stackoverflow.com/questions/2589711/..., stackoverflow.com/questions/5927633/...), und es wird in Ordnung sein.Windows? Unix?
Unix benötigen eine shebang-und exec-Attribut zu arbeiten:
als die erste Zeile des Skripts und:
at-Befehl-Linie oder
wie zuvor erwähnt.
Windows sollten funktionieren, wenn Sie fügen Sie die shell=True parameter für den "call" aufrufen.
call('python script.py')
funktioniert nicht auf nicht-Windows-Systeme. Es solltecheck_call([sys.executable or 'python', '/path/to/script.py'])
. Und Sie brauchen nicht die shebang-und Ausführungsberechtigung, wennpython
ausführbare Datei angegeben ist.Check out this.
subprocess.call
erwartet die gleichen Argumente wiesubprocess.Popen
- das ist eine Liste von strings (dieargv
in C) statt einer einzelnen Zeichenfolge.Es ist durchaus möglich, dass Ihr Kind-Prozess versucht, Ausführung "s" mit dem Parameter "- o", "m", "e", ...
Wenn Sie auf Linux/Unix konnten Sie vermeiden, call (), die insgesamt und nicht ausgeführt, eine völlig neue Instanz des Python-executable und seine Umgebung.
Für was es Wert ist.
subprocess
Modul verwendetfork/exec
auf POSIX-Systemen undCreateProcess
auf Windows. Keine Notwendigkeit zu verwendenfork
direkt, wenn Sie möchten, führen Sie ein Python-Skript.Was ist falsch mit
oder noch besser wickeln Sie die Funktionalität in einer Funktion, z.B. baz, dann tun Sie dies.
Scheint es eine Menge Skripts, beginnend python-Prozesse oder-Verzweigung, ist, dass eine Anforderung?
Prüfen Sie zunächst, ob
somescript.py
ausführbar ist und beginnt mit etwas entlang der Linien von#!/usr/bin/python
.Wenn dies geschehen ist, dann können Sie
subprocess.call('./somescript.py')
.Oder andere Antwort Punkte heraus, die Sie tun könnten
subprocess.call(['python', 'somescript.py'])
.Den Teilprozess call ist ein sehr literal-minded-system nennen. es kann verwendet werden, für jede generische Verfahren...also nicht wissen, was zu tun ist mit einem Python-Skript automatisch.
Versuchen
Wenn das nicht funktioniert, möchten Sie vielleicht versuchen, einen absoluten Pfad, und/oder überprüfen Sie die Berechtigungen auf Ihrem Python-Skript...die typischen Dinge, die Spaß machen.