如何在运行后硬挂起或暂停 python 脚本,以便它不会在完成时强制关闭?
How to hard suspend or pause a python script after it runs so it doesn’t force close upon completion?
你好,我正在编写一个涉及循环函数的 python 脚本,到目前为止循环函数进程由于某种原因失败了(虽然我有点知道为什么)但是我遇到了问题os.system('pause') 并在代码末尾输入 (“prompt:”) 以暂停所有 activity 这样我就可以在脚本完成和终止之前阅读错误消息,但脚本仍然关闭,我需要一种方法来硬暂停它或在 window 突然关闭之前冻结它。需要帮助和任何进一步的见解。
Ps。如果您需要更多信息以更好地描述此问题,请告诉我。
我曾经需要这样的东西。我有一个包装器,它加载了一堆模块和数据,然后等待提示 运行 一些东西。如果我在一个模块中犯了一个愚蠢的错误,它就会退出,并且它花在将所有数据加载到内存中的时间将被浪费,这超过 1 分钟。对我来说,我想要一种方法将数据保存在内存中,即使我在模块中出现错误,这样我也可以编辑模块并重新运行脚本。
为此:
while True:
update = raw_input("Paused. Enter = start, 'your input' = update params, C-C = exit")
if update:
update = update.split()
#unrelevant stuff used to parse my update
#custom thing to reload all my modules
fullReload()
try:
#my main script that needed all those modules and data loaded
model_starter.main(stuff, stuff2)
except Exception as e:
print(e)
traceback.print_exc()
continue
except KeyboardInterrupt:
print("I think you hit C-C. Do it again to exit.")
continue
except:
print("OSERROR? sys.exit()? who knows. C-C to exit.")
continue
这保留了我在 while
循环开始之前从中获取的所有加载数据,并防止出现错误退出。这也意味着我仍然可以 ctrl+c
退出,我只需要从这个包装器开始,而不是一旦它到达主脚本。
这就是您要找的东西吗?
答案基本上是,您必须捕获所有异常,并有一种方法在您找出并解决问题后重新启动循环。
我假设您只是 'double clicking' Window Explorer 上的图标。这有你在这里遇到的缺点,因为 shell(终端 window)在进程完成时关闭,所以如果它因错误而终止,你无法判断出了什么问题。
更好的方法是使用 command prompt
。如果你不熟悉这个,网上有很多教程。
这将有助于解决您的问题的原因是,一旦导航到脚本的包含目录,您可以使用 python your_script.py
(假设 python
在您的路径环境变量中)到 运行 相同的脚本 window.
然后,即使失败,您也可以阅读错误消息,因为您只会返回到命令行。
另一种 hacky 方法是创建一个名为 run_pythons.py
的脚本,它将使用 subprocess
模块在同一个 window 中调用您的实际脚本,然后 (无论它如何终止),在终止自身之前等待您的输入,以便您可以阅读错误消息。
所以像这样:
import subprocess
subprocess.call(('python', input('enter script name: ')))
input('press ENTER to kill me')
你好,我正在编写一个涉及循环函数的 python 脚本,到目前为止循环函数进程由于某种原因失败了(虽然我有点知道为什么)但是我遇到了问题os.system('pause') 并在代码末尾输入 (“prompt:”) 以暂停所有 activity 这样我就可以在脚本完成和终止之前阅读错误消息,但脚本仍然关闭,我需要一种方法来硬暂停它或在 window 突然关闭之前冻结它。需要帮助和任何进一步的见解。
Ps。如果您需要更多信息以更好地描述此问题,请告诉我。
我曾经需要这样的东西。我有一个包装器,它加载了一堆模块和数据,然后等待提示 运行 一些东西。如果我在一个模块中犯了一个愚蠢的错误,它就会退出,并且它花在将所有数据加载到内存中的时间将被浪费,这超过 1 分钟。对我来说,我想要一种方法将数据保存在内存中,即使我在模块中出现错误,这样我也可以编辑模块并重新运行脚本。
为此:
while True:
update = raw_input("Paused. Enter = start, 'your input' = update params, C-C = exit")
if update:
update = update.split()
#unrelevant stuff used to parse my update
#custom thing to reload all my modules
fullReload()
try:
#my main script that needed all those modules and data loaded
model_starter.main(stuff, stuff2)
except Exception as e:
print(e)
traceback.print_exc()
continue
except KeyboardInterrupt:
print("I think you hit C-C. Do it again to exit.")
continue
except:
print("OSERROR? sys.exit()? who knows. C-C to exit.")
continue
这保留了我在 while
循环开始之前从中获取的所有加载数据,并防止出现错误退出。这也意味着我仍然可以 ctrl+c
退出,我只需要从这个包装器开始,而不是一旦它到达主脚本。
这就是您要找的东西吗?
答案基本上是,您必须捕获所有异常,并有一种方法在您找出并解决问题后重新启动循环。
我假设您只是 'double clicking' Window Explorer 上的图标。这有你在这里遇到的缺点,因为 shell(终端 window)在进程完成时关闭,所以如果它因错误而终止,你无法判断出了什么问题。
更好的方法是使用 command prompt
。如果你不熟悉这个,网上有很多教程。
这将有助于解决您的问题的原因是,一旦导航到脚本的包含目录,您可以使用 python your_script.py
(假设 python
在您的路径环境变量中)到 运行 相同的脚本 window.
然后,即使失败,您也可以阅读错误消息,因为您只会返回到命令行。
另一种 hacky 方法是创建一个名为 run_pythons.py
的脚本,它将使用 subprocess
模块在同一个 window 中调用您的实际脚本,然后 (无论它如何终止),在终止自身之前等待您的输入,以便您可以阅读错误消息。
所以像这样:
import subprocess
subprocess.call(('python', input('enter script name: ')))
input('press ENTER to kill me')