Ich habe ein Problem mit dem folgenden Code:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
Ich möchte, dass das "Ende" nach 10 Sekunden gedruckt wird. (Ich weiß, dass dies ein dummes Beispiel ist, ich könnte einfach in Python schlafen, aber diese einfache Datei sleep.sh war nur ein Test)
Antworten:
Die Ausführung von sleep.sh und das Hinzufügen
shell=True
zur Parameterliste (wie in den vorherigen Antworten vorgeschlagen) funktioniert einwandfrei. Abhängig vom Suchpfad müssen Sie möglicherweise auch./
einen anderen geeigneten Pfad hinzufügen . (Dh, wechseln Sie"sleep.sh"
zu"./sleep.sh"
.)Der
shell=True
Parameter wird nicht benötigt (unter einem Posix-System wie Linux), wenn die erste Zeile des Bash-Skripts ein Pfad zu einer Shell ist. zum Beispiel#!/bin/bash
.quelle
Wenn
sleep.sh
der Shebang#!/bin/sh
und die entsprechenden Dateiberechtigungen vorhanden sind, führen Sie ihn auschmod u+rx sleep.sh
, um sicherzustellen, dass er vorhanden ist.$PATH
Dann sollte Ihr Code wie folgt funktionieren:Wenn sich das Skript nicht im PATH befindet, geben Sie den vollständigen Pfad dazu an, z. B. wenn es sich im aktuellen Arbeitsverzeichnis befindet:
Wenn das Skript keinen Shebang hat, müssen Sie Folgendes angeben
shell=True
:Wenn das Skript keine ausführbaren Berechtigungen hat und Sie es nicht ändern können, z. B. durch Ausführen, können
os.chmod('sleep.sh', 0o755)
Sie das Skript als Textdatei lesen undsubprocess
stattdessen die Zeichenfolge an das Modul übergeben:quelle
Eigentlich muss man nur das
shell=True
Argument hinzufügen :Aber Vorsicht -
Quelle
quelle
sleep.sh
nicht in derPATH
. Und wenn es ist auf dem Weg , und es hat den richtigen shebang dann brauchen Sie nichtshell=True
. Siehe meine AntwortWenn jemand ein Skript mit Argumenten aufrufen möchte
Denken Sie daran, die Argumente vor dem Übergeben mit str (arg) in einen String umzuwandeln.
Dies kann verwendet werden, um so viele Argumente wie gewünscht zu übergeben:
quelle
Stellen Sie sicher, dass das
sleep.sh
über Ausführungsberechtigungen verfügt, und führen Sie es aus mitshell=True
:quelle
#!bin/bash
ist ein fehlender/
.#!/bin/bash
funktioniert wie ich in einer Antwort notiere.Wenn chmod nicht funktioniert, versuchen Sie es auch
Test von mir danke
quelle
os.system
Dokumentation wird ausdrücklich empfohlen, dies zu vermeidensubprocess
(heutzutagesubprocess.run()
). Wenn Sie nichtsubprocess
zur Arbeit kommen können, haben Sie wahrscheinlich auch Probleme damitos.system()
.Hinzufügen einer Antwort, da ich hierher geleitet wurde, nachdem ich gefragt hatte, wie ein Bash-Skript von Python ausgeführt werden soll. Sie erhalten eine Fehlermeldung,
OSError: [Errno 2] file not found
wenn Ihr Skript Parameter übernimmt. Nehmen wir zum Beispiel an, Ihr Skript hat einen Ruhezeitparameter aufgenommen: Funktioniertsubprocess.call("sleep.sh 10")
nicht, Sie müssen ihn als Array übergeben:subprocess.call(["sleep.sh", 10])
quelle
shell=True
verstehen, aber ja, normalerweise ist es Ihr bestes Spiel, dies zu vermeiden.