OSError:[Errno 7] ubuntu上的参数列表太长,python用popen调用bitcoind-cli

时间:2014-11-04 12:19:15

标签: python popen bitcoind

运行在ubuntu上使用popen调用bitcoind-cli的python脚本,在有很多trasactions的大块上,调用getrawtransaction时我得到错误 OSError:[Errno 7]参数列表太长

我知道它是shell和python脚本之间的缓冲区问题? 有一个论点,我想这只是一个很长的

我需要检查别的吗? 我可以以某种方式使缓冲区更大或我应该更改我与bitcoind交互到RPC的方法吗?

在本地和AWS ubuntu计算机上尝试过它

感谢

2 个答案:

答案 0 :(得分:0)

由于您使用的是Python,因此您可以做的最好的事情就是使用RPC,例如:

import base64
import requests

response = requests.post(
    bitcoind_url, 
    data=json.dumps(
        {
            'method': method,
            'params': params,
            'jsonrpc': '2.0',
            'id': 0,
        }
    ), 
    headers={'content-type': 'application/json', 'Authorization': b'Basic ' + base64.b64encode(rpcuser + b':' + rpcpassword)})

其中params是特定method的参数列表。

您可以从bitcoind配置文件中获取rpcuserrpcpassword

答案 1 :(得分:0)

这是您的操作系统限制,例如:

>>> import os
>>> os.execl('/bin/ls', 'ls', 'c'*10**7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/os.py", line 314, in execl
    execv(file, args)
OSError: [Errno 7] Argument list too long

是否有必要在您的情况下传递命令行上的数据(您可以使用管道/文件/套接字等吗?)?您可以使用拆分的命令行参数多次运行该命令吗?请参阅Solving “mv: Argument list too long”

如果传递的环境太大,您可能会收到相同的错误:

>>> os.execle('/usr/bin/env', 'env', {'envvar': 'c'*10**9})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/os.py", line 322, in execle
    execve(file, args[:-1], env)
OSError: [Errno 7] Argument list too long

解决方案是清理传递的环境以避免未使用的大型envvars。

The limits might be hardcoded in the kernel source