如何退出然后自动重启代码

How to exit and then automatically restart code

我有一些 python 代码可以抓取网站并报告特定加密货币的实时价格。当我使用 while 循环继续打印实时价格时,即使网站上的实时价格发生变化,它也会一遍又一遍地打印相同的价格。我想也许我的代码正在抓取它并以太快的速度访问该网站,所以我使用时间模块添加了延迟,但即使在延迟 1 分钟后,它也不会显示正确的价格,而是一遍又一遍地打印相同的价格。手动结束并重新启动代码似乎可以让这个错误消失,但我希望这个程序 运行 24/7 并在价格达到某个点时给我发电子邮件。到目前为止,这是我的代码:(顺便说一句,我是初学者)

import requests
import bs4
import time

run = True
while run == True:
    # time.sleep(60)
    res = requests.get("https://coinmarketcap.com/currencies/gitcoin/")
    soup_obj = bs4.BeautifulSoup(res.text, "lxml")
    item = soup_obj.select(".priceValue___11gHJ")[0]
    item = item.text
    print(item)
    exit()

这有一个循环,但我添加了一个 exit() 函数以使其结束,因此我可以手动重新启动它。我只需要一种方法让这段代码自动结束,然后反复重启。我也在使用 Pycharm 的社区版(最新版)。

您可以编写程序来调用子进程,而不是自己进行网络调用。该子进程可以通过 stdout 调用请求,return 任何你想要的并退出。有多种方法可以做到这一点。您可以编写单独的脚本或使用 multiprocess.Process,但在本示例中,我编写了一个脚本,该脚本会调用自身并使用命令行参数来了解它扮演的角色。

import sys

if len(sys.argv) == 1:
    # run poller as subprocess so it exits
    import time
    import subprocess as subp
    while True:
        result = subp.run([sys.executable, __file__, "called"], capture_output=True)
        # assuming program returns ascii float in single line
        item = result.stdout.decode("ascii").strip()
        print(item)
        time.sleep(60)
else:
    import requests
    import bs4
    res = requests.get("https://coinmarketcap.com/currencies/gitcoin/")
    soup_obj = bs4.BeautifulSoup(res.text, "lxml")
    item = soup_obj.select(".priceValue___11gHJ")[0]
    item = item.text
    sys.stdout.write(item)