![](/img/trans.png)
[英]OSError: [Errno 7] Argument list too long: 'php' - Python 3.6
[英]OSError: [Errno 7] Argument list too long on ubuntu, python calling bitcoind-cli with popen
运行在ubuntu上使用popen调用bitcoind-cli的python脚本,在具有许多trasactions的大块上,当调用getrawtransaction时我得到错误OSError:[Errno 7]参数列表太长
我明白这是shell和python脚本之间的缓冲问题? 有一个论点,我想这只是一个很长的论点
需要我检查别的吗? 我可以以某种方式使缓冲区更大或我应该更改我与bitcoind交互到RPC的方法?
在本地和AWS ubuntu机器上尝试过它
谢谢
这是您的操作系统限制,例如:
>>> 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:参数列表太长” 。
如果传递的环境太大,您可能会得到相同的错误:
>>> 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
解决方案是清理传递的环境以避免未使用的大型envvar。
由于您使用的是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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.