Warum wird dieses bash-Aufruf von python nicht funktioniert?
Ich bin Herumspielen mit Bitcoins ein bisschen. Wenn ich will Holen Sie sich einige Informationen über die lokalen bitcoin installieren, habe ich einfach laufen bitcoin getinfo
und ich bekomme so etwas wie dieses:
{
"version" : 90100,
"protocolversion" : 70002,
"walletversion" : 60000,
"balance" : 0.00767000,
"blocks" : 306984,
"timeoffset" : 0,
"connections" : 61,
"proxy" : "",
"difficulty" : 13462580114.52533913,
"testnet" : false,
"keypoololdest" : 1394108331,
"keypoolsize" : 101,
"paytxfee" : 0.00000000,
"errors" : ""
}
Ich jetzt tun möchten diesen Anruf von innerhalb von Python (bevor jemand Punkte Sie aus; ich weiß, es gibt Python-Implementierungen für Bitcoin, ich will nur lernen, es selbst zu tun). So versuchte ich zunächst ausführen eines einfachen ls
Befehl wie diesen:
import subprocess
process = subprocess.Popen('ls', stdout=subprocess.PIPE)
output = process.communicate()[0]
print output
Dieser funktioniert einwandfrei, drucken Sie sich die Liste der Dateien und Ordner als erwartet. So dann habe ich dieses:
import subprocess
process = subprocess.Popen('bitcoin getinfo', stdout=subprocess.PIPE)
output = process.communicate()[0]
print output
aber das gibt die folgende Fehlermeldung:
Traceback (most recent call last):
File "testCommandLineCommands.py", line 2, in <module>
process = subprocess.Popen('bitcoin getinfo', stdout=subprocess.PIPE)
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
und hier, ich bin irgendwie verloren. Weiß jemand, was ist hier falsch? Alle Tipps sind willkommen!
[BEARBEITEN]
Mit den hervorragenden Antworten unten habe ich nun die folgende Funktion, die in handliches kommen könnte auch für andere. Es nimmt entweder einen string, oder eine iterierbar mit separaten Argumenten und analysiert den Ausgang, wenn es ist json:
def doCommandLineCommand(command):
process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=isinstance(command, str))
output = process.communicate()[0]
try:
return json.loads(output)
except ValueError:
return output
- Sind Sie sicher, dass Ihr Skript wirklich sieht "bitcoin" ausführbare Datei? Wenn es in /usr/bin oder gleichwertig, versuchen Sie geben den vollständigen Pfad.
ls
ist ashell Befehl und zugänglich überall, das ist, warum es funktioniert. - Ich denke, man kann Teilprozess.check_output jetzt! Bitte seien Sie vorsichtig über die potentielle Sicherheitsprobleme mit
shell=True
!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entweder eine Sequenz, in der Argumente:
oder legen Sie die
shell
parameterTrue
:Weitere Informationen finden Sie in der Dokumentation:
File "/usr/lib/python2.7/subprocess.py", line 659, in __init__ raise TypeError("bufsize must be an integer")
, aber die zweite option tatsächlich funktioniert! Genial! Irgendeine Idee warum ich den Fehler mit der ersten option, obwohl?['bitcoin', 'getinfo']
und nicht'bitcoin', 'getinfo'
? Klammern sind erforderlich.verwenden Sie den folgenden code:
dürfen Sie keine Leerzeichen verwenden für die übergabe von Parametern.
File "/usr/lib/python2.7/subprocess.py", line 659, in __init__ raise TypeError("bufsize must be an integer")
. Keine Ahnung warum das auch nicht?[]
für die übergabeargs