我正在使用Visual Studio代码尝试从平衡器中抽蜡烛,但我不断收到以下错误:
ModuleNotFoundError: No module named 'binance.client'; 'binance' is not a package
以下是导致错误的代码行:
from binance.client import Client
我已经确保我将python-binance安装到正确版本的python上,并且从IVE读取的内容中猜测路径存在问题,但不确定要查找的内容。我运行以下代码检查路径
import pprint, os
import binance
pprint.pprint(os.path.abspath(binance.__file__))
这是我的结果
'/Users/myName/.local/lib/python3.7/site-packages/binance.py'
我读到具有名为binance.py的文件可能会使其混乱,但这是下载该文件时给出的名称。如果您对这里的外观感到好奇,那就是:
import hmac
import hashlib
import logging
import requests
import time
try:
from urllib import urlencode
# for python3
except ImportError:
from urllib.parse import urlencode
ENDPOINT = "https://www.binance.com"
BUY = "BUY"
SELL = "SELL"
LIMIT = "LIMIT"
MARKET = "MARKET"
GTC = "GTC"
IOC = "IOC"
options = {}
def set(apiKey, secret):
"""Set API key and secret.
Must be called before any making any signed API calls.
"""
options["apiKey"] = apiKey
options["secret"] = secret
def prices():
"""Get latest prices for all symbols."""
data = request("GET", "/api/v1/ticker/allPrices")
return {d["symbol"]: d["price"] for d in data}
def tickers():
"""Get best price/qty on the order book for all symbols."""
data = request("GET", "/api/v1/ticker/allBookTickers")
return {d["symbol"]: {
"bid": d["bidPrice"],
"ask": d["askPrice"],
"bidQty": d["bidQty"],
"askQty": d["askQty"],
} for d in data}
def depth(symbol, **kwargs):
"""Get order book.
Args:
symbol (str)
limit (int, optional): Default 100. Must be one of 50, 20, 100, 500, 5,
200, 10.
"""
params = {"symbol": symbol}
params.update(kwargs)
data = request("GET", "/api/v1/depth", params)
return {
"bids": {px: qty for px, qty, _ in data["bids"]},
"asks": {px: qty for px, qty, _ in data["asks"]},
}
def klines(symbol, interval, **kwargs):
"""Get kline/candlestick bars for a symbol.
Klines are uniquely identified by their open time. If startTime and endTime
are not sent, the most recent klines are returned.
Args:
symbol (str)
interval (str)
limit (int, optional): Default 500; max 500.
startTime (int, optional)
endTime (int, optional)
"""
params = {"symbol": symbol, "interval": interval}
params.update(kwargs)
data = request("GET", "/api/v1/klines", params)
return [{
"openTime": d[0],
"open": d[1],
"high": d[2],
"low": d[3],
"close": d[4],
"volume": d[5],
"closeTime": d[6],
"quoteVolume": d[7],
"numTrades": d[8],
} for d in data]
def balances():
"""Get current balances for all symbols."""
data = signedRequest("GET", "/api/v3/account", {})
if 'msg' in data:
raise ValueError("Error from exchange: {}".format(data['msg']))
return {d["asset"]: {
"free": d["free"],
"locked": d["locked"],
} for d in data.get("balances", [])}
def order(symbol, side, quantity, price, orderType=LIMIT, timeInForce=GTC,
test=False, **kwargs):
"""Send in a new order.
Args:
symbol (str)
side (str): BUY or SELL.
quantity (float, str or decimal)
price (float, str or decimal)
orderType (str, optional): LIMIT or MARKET.
timeInForce (str, optional): GTC or IOC.
test (bool, optional): Creates and validates a new order but does not
send it into the matching engine. Returns an empty dict if
successful.
newClientOrderId (str, optional): A unique id for the order.
Automatically generated if not sent.
stopPrice (float, str or decimal, optional): Used with stop orders.
icebergQty (float, str or decimal, optional): Used with iceberg orders.
"""
params = {
"symbol": symbol,
"side": side,
"type": orderType,
"timeInForce": timeInForce,
"quantity": formatNumber(quantity),
"price": formatNumber(price),
}
params.update(kwargs)
path = "/api/v3/order/test" if test else "/api/v3/order"
data = signedRequest("POST", path, params)
return data
def orderStatus(symbol, **kwargs):
"""Check an order's status.
Args:
symbol (str)
orderId (int, optional)
origClientOrderId (str, optional)
recvWindow (int, optional)
"""
params = {"symbol": symbol}
params.update(kwargs)
data = signedRequest("GET", "/api/v3/order", params)
return data
def cancel(symbol, **kwargs):
"""Cancel an active order.
Args:
symbol (str)
orderId (int, optional)
origClientOrderId (str, optional)
newClientOrderId (str, optional): Used to uniquely identify this
cancel. Automatically generated by default.
recvWindow (int, optional)
"""
params = {"symbol": symbol}
params.update(kwargs)
data = signedRequest("DELETE", "/api/v3/order", params)
return data
def openOrders(symbol, **kwargs):
"""Get all open orders on a symbol.
Args:
symbol (str)
recvWindow (int, optional)
"""
params = {"symbol": symbol}
params.update(kwargs)
data = signedRequest("GET", "/api/v3/openOrders", params)
return data
def allOrders(symbol, **kwargs):
"""Get all account orders; active, canceled, or filled.
If orderId is set, it will get orders >= that orderId. Otherwise most
recent orders are returned.
Args:
symbol (str)
orderId (int, optional)
limit (int, optional): Default 500; max 500.
recvWindow (int, optional)
"""
params = {"symbol": symbol}
params.update(kwargs)
data = signedRequest("GET", "/api/v3/allOrders", params)
return data
def myTrades(symbol, **kwargs):
"""Get trades for a specific account and symbol.
Args:
symbol (str)
limit (int, optional): Default 500; max 500.
fromId (int, optional): TradeId to fetch from. Default gets most recent
trades.
recvWindow (int, optional)
"""
params = {"symbol": symbol}
params.update(kwargs)
data = signedRequest("GET", "/api/v3/myTrades", params)
return data
def request(method, path, params=None):
resp = requests.request(method, ENDPOINT + path, params=params)
data = resp.json()
if "msg" in data:
logging.error(data['msg'])
return data
def signedRequest(method, path, params):
if "apiKey" not in options or "secret" not in options:
raise ValueError("Api key and secret must be set")
query = urlencode(sorted(params.items()))
query += "×tamp={}".format(int(time.time() * 1000))
secret = bytes(options["secret"].encode("utf-8"))
signature = hmac.new(secret, query.encode("utf-8"),
hashlib.sha256).hexdigest()
query += "&signature={}".format(signature)
resp = requests.request(method,
ENDPOINT + path + "?" + query,
headers={"X-MBX-APIKEY": options["apiKey"]})
data = resp.json()
if "msg" in data:
logging.error(data['msg'])
return data
def formatNumber(x):
if isinstance(x, float):
return "{:.8f}".format(x)
else:
return str(x)
感谢任何帮助或建议,谢谢!
答案 0 :(得分:1)
我将文件夹的名称从“binance”更改为“binance_mod”,这解决了问题。我相信错误在于 binance 文件夹和 binance.py 文件都在站点包中。
从那里我刚刚做的
from binance_mod.client import Client
我没有问题
答案 1 :(得分:0)
卸载,重新安装,升级。
python -m pip卸载python-binance
python -m pip安装python-binance
python -m pip install-升级python-binance
2。看起来您正在编写的binance.py文件位于站点包中。当您安装python-binance时,在您的站点软件包中创建了一个名为binance的文件夹
您可以移动正在处理的文件或重命名正在处理的文件。
这就是你在做什么:
从binance.client导入客户端
这是什么意思:
从位于site_packages的binance文件夹中的从client.py文件导入客户端类。
由于您具有binance.py,因此它可能会覆盖binance文件夹,但不能确定为什么模块会尝试自行导入。除非您做的不同。
答案 2 :(得分:0)
尝试安装binance-connector-python pip3 install binance-connector-python
答案 3 :(得分:0)
我通过专门使用 conda 安装twisted 解决了这个问题:(其他来源不起作用)
conda install twisted