4

在 ubuntu 上使用 popen 在具有许多事务的大块上运行调用 bitcoind-cli 的 python 脚本,当调用 getrawtransaction 时出现错误OSError: [Errno 7] Argument list too long

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

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

在本地和 AWS ubuntu 机器上尝试过

谢谢

4

2 回答 2

1

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

>>> 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

在您的情况下,是否有必要在命令行上传递数据(您可以使用管道/文件/套接字等代替吗?)?您可以使用拆分的命令行参数多次运行该命令吗?请参阅解决“mv:参数列表太长”</a>。

如果传递的环境太大,你可能会得到同样的错误:

>>> 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

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

这些限制可能在内核源代码中被硬编码

于 2016-03-08T18:45:08.740 回答
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 配置文件中获取rpcuser和获取。rpcpassword

于 2016-03-07T21:04:29.123 回答