You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python交易脚本遇List assignment index out of range错误后自动重启方案咨询

问题描述

我是交易机器人开发新手,编写的Python交易脚本逻辑如下:遍历包含ETH/EUR、BTC/EUR等交易对的列表,每次删除列表首元素并切换交易对执行交易逻辑,遍历完成后恢复列表并循环执行。脚本已运行数小时、循环超1000次,但偶尔会触发List assignment index out of range(列表索引越界)错误,手动重启脚本后问题消失。现咨询:

  • 能否在except异常处理块中添加命令实现脚本自动重启?
  • 或有更优的解决方案?

用户提供的原始代码:

import time
from playsound import playsound

all = ['ETH/EUR', 'BTC/EUR', 'ADA/EUR', 'XRP/EUR', 'ETH/EUR', 'SOL/EUR', 'MANA/EUR',]
symbol = all[0]


def getsignals():
    '''
    # this function checks the symbols or tickers one by one for buying or 
    #selling triggers
    '''

def runbot(): 
    getsignals()
    time.sleep(2)


while True:
    try:
        del all[0]          
        symbol = all[0]
        print(F'-- The new symbol is now -- {symbol}')
        runbot()


        del all[0]
        symbol = all[0]
        print(F'-- The new symbol is now -- {symbol}')
        runbot()


        del all[0]
        symbol = all[0]
        print(F'-- The new symbol is now -- {symbol}')
        runbot()


        del all[0]
        symbol = all[0]
        print(F'-- The new symbol is now -- {symbol}')
        runbot()


        del all[0]
        symbol = all[0]
        print(F'-- The new symbol is now -- {symbol}')
        runbot()


        del all[0]
        symbol = all[0]
        print(F'-- The new symbol is now -- {symbol}')
        runbot()
        all = ['ETH/EUR', 'BTC/EUR', 'ADA/EUR', 'XRP/EUR', 'ETH/EUR', 'SOL/EUR', 'MANA/EUR',] 
        print('------that was all of them------new round------')


    except Exception as e:
        print(e)
        print('-----error terror-----')
        playsound('problem.wav') 
          
        
    time.sleep(5)

解决方案

一、实现脚本自动重启

可以用os.execv()替换当前进程实现重启,需要导入os和sys模块。修改后的except块如下:

import os
import sys
# ... 其他原有导入

except Exception as e:
    print(e)
    print('-----error terror-----')
    playsound('problem.wav') 
    # 重启脚本,sys.executable是当前Python解释器路径,sys.argv是启动参数
    os.execv(sys.executable, [sys.executable] + sys.argv)

注意:如果用了虚拟环境,要确保sys.executable指向虚拟环境里的Python解释器,避免用系统默认版本。

二、更优方案:修复索引越界的根源

你的代码问题出在手动重复修改列表+依赖固定次数的删除操作,一旦列表长度意外变化(比如其他逻辑修改了all、或者某次循环中列表未正确恢复)就会触发索引错误。直接迭代列表副本的方式更健壮:

优化后代码

import time
from playsound import playsound

# 定义交易对模板,每次循环用副本,不修改原始模板
SYMBOLS_TEMPLATE = ['ETH/EUR', 'BTC/EUR', 'ADA/EUR', 'XRP/EUR', 'ETH/EUR', 'SOL/EUR', 'MANA/EUR']

def getsignals():
    '''检查交易对的买卖触发信号'''
    # 这里补充你的信号检测逻辑

def runbot(symbol): 
    print(f'-- 当前交易对:{symbol} --')
    getsignals()
    time.sleep(2)

while True:
    # 每次循环创建模板的副本,避免修改原始数据
    for symbol in SYMBOLS_TEMPLATE.copy():
        runbot(symbol)
        time.sleep(5)  # 切换交易对前的等待时间
    print('------本轮遍历完成,开始下一轮------')

优化说明

  • 用SYMBOLS_TEMPLATE.copy()每次循环生成独立列表,彻底避免了修改原始列表导致的索引问题
  • 用for循环自动遍历所有交易对,无需手动写6次重复代码,简洁易维护
  • 把交易对作为参数传入runbot,避免全局变量symbol带来的潜在问题
  • 从根源上消除了索引越界的可能,for循环会安全遍历每个元素

内容的提问来源于stack exchange,提问作者Wim Kraatz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:30:43