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!
InformationsquelleAutor kramer65 | 2014-06-21
Schreibe einen Kommentar