python - 如何在参数错误时重新启动脚本?
问题描述
我有我的算法交易脚本,我想一直运行到取消,但脚本总是在以下错误时崩溃,我不知道如何解决,很可能是由于互联网连接不稳定。
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
脚本正在打印什么。
它应该:
失败重启
从原始脚本打印所有内容
我使用一个参数运行的辅助脚本,该参数由子进程在启动的脚本上传递。
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 重新启动脚本的解决方案。
解决方案
我让它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
推荐阅读
- selenium - 如何同时在多台服务器上运行我的 selenium 脚本,以便我可以一一节省执行时间?
- node.js - 尝试验证附加到用户基础模型的模型时,Loopback 3 崩溃
- docker - 如何使用 docker exec 安装 Composer
- python - Pandas convert datatime format
- mouseevent - MousePressed 获取错误的源 JPanel
- r - Unable to filter sampled dataframe - R
- javascript - 在反应中传播道具
- angularjs - Highchart没有在ajax函数angularjs中呈现
- java - 无法在 JavaRDD 中加载数据
- node.js - ReferenceError:未定义请求