为什么这个python的python调用不起作用?

我用比特币搞乱了一下。 当我想获得关于本地比特币安装的一些信息时,我只需运行bitcoin getinfo然后获得如下所示的信息:

{
    "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" : ""
}

我现在想从Python内部执行此调用(在任何人指出之前;我知道有比特币的Python实现,我只是想自己学习)。 所以我首先尝试执行一个简单的ls命令,如下所示:

import subprocess
process = subprocess.Popen('ls', stdout=subprocess.PIPE)
output = process.communicate()[0]
print output

这工作正常,按预期打印出文件和文件夹列表。 那么我做到了这一点:

import subprocess
process = subprocess.Popen('bitcoin getinfo', stdout=subprocess.PIPE)
output = process.communicate()[0]
print output

但是这给出了以下错误:

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

在这里我有点失落。 有人知道这里有什么问题吗? 欢迎所有提示!

[编辑]使用下面的优秀答案我现在做了以下功能,这对其他人来说也可能会派上用场。 它可以是一个字符串,也可以是一个带有单独参数的迭代器,如果是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

在参数中使用一个序列:

process = subprocess.Popen(['bitcoin', 'getinfo'], stdout=subprocess.PIPE)

或者将shell参数设置为True

process = subprocess.Popen('bitcoin getinfo', stdout=subprocess.PIPE, shell=True)

您可以在文档中找到更多信息:

所有调用都需要args,并且应该是一个字符串或一系列程序参数。 提供一系列参数通常是首选的,因为它允许模块处理任何所需的参数转义和引用(例如允许文件名中的空格)。 如果传递一个字符串,则shell必须为True(见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。


使用下面的代码:

process = subprocess.Popen(['bitcoin', 'getinfo'], stdout=subprocess.PIPE)

您不允许使用空格来传递参数。

链接地址: http://www.djcxy.com/p/25329.html

上一篇: Why does this bash call from python not work?

下一篇: piping together several subprocesses