python 操作错误:[Errno 12]没有足够的空间来调用os.execl

htzpubme  于 2023-02-11  发布在  Python
关注(0)|答案(2)|浏览(205)

所以我在摆弄一个脚本,它应该使用os.execl重新启动自己,它工作了几次,但是在30或40次调用之后就崩溃了;

Traceback (most recent call last):
  File "C:\Users\Admin#\PycharmProjects\DiscordBot_Fred_the_Financier\test_suit.py", line 9, in <module>
    os.execl(sys.executable, sys.executable, *(*sys.argv, code))
  File "C:\Users\Admin#\AppData\Local\Programs\Python\Python37\lib\os.py", line 540, in execl
    execv(file, args)
OSError: [Errno 12] Not enough space

这是我运行的全部代码:

import sys 
import os

print(sys.argv) # print args
code = "" # placeholder for mutable args
os.execl(sys.executable, sys.executable, *(*sys.argv, code)) # passing new args and replacing process

我完全不知道为什么和如何发生这个错误。
我所有的驱动器有〉200 GB的免费存储空间和我的RAM超过17 GB以及。
我正在运行这个代码通过终端上的Win10 64位Python 3.7.
非常感谢您的帮助!
如果这个问题已经有了答案,我很抱歉,但我找不到。

x7rlezfr

x7rlezfr1#

您是否在脚本中打开了任何大型文件?很可能您没有关闭这些文件句柄,它们不断累积。一旦脚本崩溃,所有句柄将被释放,您将看到200GB
在运行脚本的时候,你能不能关注一下磁盘的使用情况?你看到它在持续上升吗?(至少在随后的exec调用之后)
编辑:我现在看到这个问题是在'3月28日'20在18:58 '问的。我不知道为什么我看到它在主列表。问题可以关闭,如果操作员没有回答或提供更多的信息。

nzk0hqpo

nzk0hqpo2#

我还没有找到为什么会发生这个错误,但我假设它与父进程无法完全关闭有关(可能是由于留下的引用或类似的原因)。实际上,我找到了一个变通方法,我在这里离开,以防它能帮助您或其他人解决同样的问题。
解决方法是使用subprocess.Popen而不是os.execl,并立即添加os._exit(1)。后者所做的是立即关闭父进程,从而释放所有资源。因此,如果您这样做,无论您重新启动进程多少次,都不会收到“空间不足”错误。为了验证这一点,我做了一个测试,通过在无限循环中运行这两行代码(尽管在回顾中,由于os._exit(1)语句,不可能进行第二次迭代,因此这不是必需的),并让它运行一段时间,每次进程替换时写入.txt文件。我用Ctrl+C中断了最后一个进程,当我打开文件时,我发现值为15127,这意味着在我中断它之前,这个进程已经被替换了15127次,而且我从来没有因为空间问题而引发过任何异常。
此外,与os.execl一样,您可以通过传递sys.argv来传递命令行参数,例如键入:

import os
import sys
import subprocess

print(sys.argv)
code = ""
subprocess.Popen(sys.executable, *(*sys.argv, code)
os._exit(1)

我省略了第二个sys.executable,因为我不确定您要做什么,也不确定它是否能在subprocess.popen中工作,但是考虑到这两个命令的相似性,我认为如果您键入subprocess.Popen(sys.executable, sys.executable, *(*sys.argv, code),它的工作方式是相同的。

相关问题