首页 > 解决方案 > 如何在参数错误时重新启动脚本?

问题描述

我有我的算法交易脚本,我想一直运行到取消,但脚本总是在以下错误时崩溃,我不知道如何解决,很可能是由于互联网连接不稳定。

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 384, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 380, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.7/http/client.py", line 1321, in getresponse
    response.begin()
  File "/usr/lib/python3.7/http/client.py", line 296, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.7/http/client.py", line 257, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/usr/lib/python3.7/socket.py", line 589, in readinto
    return self._sock.recv_into(b)
  File "/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py", line 299, in recv_into
    raise SocketError(str(e))
OSError: (104, 'ECONNRESET')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 367, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/usr/lib/python3/dist-packages/six.py", line 692, in reraise
    raise value.with_traceback(tb)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 384, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 380, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.7/http/client.py", line 1321, in getresponse
    response.begin()
  File "/usr/lib/python3.7/http/client.py", line 296, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.7/http/client.py", line 257, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/usr/lib/python3.7/socket.py", line 589, in readinto
    return self._sock.recv_into(b)
  File "/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py", line 299, in recv_into
    raise SocketError(str(e))
urllib3.exceptions.ProtocolError: ('Connection aborted.', OSError("(104, 'ECONNRESET')"))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pi/Desktop/start_here/LiveStrategy-v20200102.py", line 349, in <module>
    continuousRun()
  File "/home/pi/Desktop/start_here/LiveStrategy-v20200102.py", line 340, in continuousRun
    Decider()
  File "/home/pi/Desktop/start_here/LiveStrategy-v20200102.py", line 287, in Decider
    getOpenPositions()
  File "/home/pi/Desktop/start_here/LiveStrategy-v20200102.py", line 206, in getOpenPositions
    openpositions = con.get_open_positions(kind='list')
  File "/home/pi/.local/lib/python3.7/site-packages/fxcmpy/fxcmpy.py", line 371, in get_open_positions
    data = self.get_model(('OpenPosition',))
  File "/home/pi/.local/lib/python3.7/site-packages/fxcmpy/fxcmpy.py", line 344, in get_model
    params={'models': list(models)})
  File "/home/pi/.local/lib/python3.7/site-packages/fxcmpy/fxcmpy.py", line 2477, in __handle_request__
    proxies=self.proxies)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 498, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', OSError("(104, 'ECONNRESET')"))

从错误中可以看出,我在 Pi 上运行我的代码,我希望脚本在出错时重新启动。到目前为止,我的交易脚本是从另一个带参数的脚本运行的,但它不起作用,我不知道subprocess脚本正在打印什么。

它应该:

  1. 失败重启

  2. 从原始脚本打印所有内容

我使用一个参数运行的辅助脚本,该参数由子进程在启动的脚本上传递。

import subprocess
import sys

symbol = sys.argv[1]
while True:
    proc = subprocess.Popen(['python', 'LiveStrategy-v20200102.py', symbol ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    proc.wait()
    print(proc)

不幸的是,这个脚本不会因错误而重新启动,我不明白为什么,我从这里的其他一些答案中得到了这个。显然它不会从subprocess脚本中打印出来,因为它没有实现。

我想将它保存在 Python 中,所以请不要使用 bash 重新启动脚本的解决方案。

标签: pythonpython-3.x

解决方案


我让它break在计数器达到您可以设置的某个条件后停止循环。

import subprocess
import sys

symbol = sys.argv[1]
counter = 0
while True:
    try:
        proc = subprocess.Popen(['python', 'LiveStrategy-v20200102.py', symbol], stdout=subprocess.PIPE,
                                stderr=subprocess.STDOUT)
        proc.wait()
        print(proc)
        break
    except:
        print("A")
        counter += 1
    if counter > 5:
        break

推荐阅读