簡體   English   中英

OSError:[Errno 7] ubuntu上的參數列表太長,python用popen調用bitcoind-cli

[英]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配置文件中獲取rpcuserrpcpassword

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM