簡體   English   中英

如何重新啟動 Python 腳本?

[英]How to restart a Python script?

在我用python編寫的程序中,如果變量變為真,我需要完全重新啟動程序,尋找了一段時間我發現了這個命令:

while True:
    if reboot == True:
        os.execv(sys.argv[0], sys.argv)

執行時返回錯誤[Errno 8] Exec format error 我在os.execv上搜索了更多文檔,但沒有找到任何相關內容,所以我的問題是是否有人知道我做錯了什么或知道重新啟動腳本的更好方法(通過重新啟動我的意思是完全重新運行腳本,就好像它是第一次打開一樣,所以所有未分配的變量都沒有運行)。

有多種方法可以實現相同的目標。 首先修改程序以在標志變為True時退出。 然后有各種選擇,每一種都有其優點和缺點。

使用 bash 腳本包裝它。

該腳本應處理退出並重新啟動您的程序。 一個非常基本的版本可能是:

#!/bin/bash
while :
do
    python program.py
    sleep 1
done

將程序作為另一個程序的子進程啟動。

首先將程序的代碼包裝到一個函數中。 然后你的__main__可能看起來像這樣:

def program():
  ### Here is the code of your program
  ...

while True:
  from multiprocessing import Process
  process = Process(target=program)
  process.start()
  process.join()
  print("Restarting...")

這段代碼比較基礎,需要實現錯誤處理。

使用流程管理器

有很多工具可以監控進程,並行運行多個進程並自動重啟停止的進程。 值得一看PM2或類似的東西。

恕我直言,第三個選項(流程管理器)看起來是最安全的方法。 其他方法將有邊緣情況,需要你方實施以處理邊緣情況。

這對我有用。 請在代碼和os.execv()頂部添加 shebang,如下所示

#!/usr/bin/env python3
import os
import sys

if __name__ == '__main__':
    while True:
        reboot = input('Enter:')
        if reboot == '1':
            sys.stdout.flush()
            os.execv(sys.executable, [sys.executable, __file__] + [sys.argv[0]])
        else:
            print('OLD')

我得到了相同的“執行格式錯誤”,我相信這基本上與您在命令提示符下鍵入 python 腳本名稱並期望它執行時遇到的錯誤基本相同。 在 linux 上它不起作用,因為需要路徑,並且 execv 方法基本上遇到相同的錯誤。

您可以添加您的 python 編譯器的路徑名,並且該錯誤消失,除了您的腳本名稱然后成為參數並且必須添加到 argv 列表中。 為避免這種情況,請通過在腳本頂部添加“#!/usr/bin/python3”和 chmod 755 使您的腳本獨立可執行。

這對我有用:

#!/usr/bin/python3
# this script is called foo.py

import os
import sys
import time

if (len(sys.argv) >= 2):
    Arg1 = int(sys.argv[1])
else:
    sys.argv.append(None)
    Arg1 = 1

print(f"Arg1: {Arg1}")

sys.argv[1] = str(Arg1 + 1)
time.sleep(3)

os.execv("./foo.py", sys.argv) 

輸出:

Arg1: 1
Arg1: 2
Arg1: 3
.
.
.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM