在Python中调用os.unlink(_文件__)安全吗?
我正在linux上使用Python 2.6 我有一个run.py脚本,它在后台启动多个服务,并生成kill.py来终止这些进程 在kill.py中,当它完成工作时,是否可以安全地断开自身链接在Python中调用os.unlink(_文件__)安全吗?,python,linux,Python,Linux,我正在linux上使用Python 2.6 我有一个run.py脚本,它在后台启动多个服务,并生成kill.py来终止这些进程 在kill.py中,当它完成工作时,是否可以安全地断开自身链接 import os # kill services os.unlink(__file__) # is it safe to do something here? 我是Python新手。我担心的是,由于Python是一种脚本语言,所以整个脚本可能不在内存中。在解除链接后,将不会有进一步的代码进行解释 我试过
import os
# kill services
os.unlink(__file__)
# is it safe to do something here?
我是Python新手。我担心的是,由于Python是一种脚本语言,所以整个脚本可能不在内存中。在解除链接后,将不会有进一步的代码进行解释
我试过这个小测试
import os
import time
time.sleep(10) # sleep 1
os.unlink(__file__)
time.sleep(10) # sleep 2
当运行这个文件时,我运行了stat kill.py
,链接数始终为1,所以我猜Python解释器没有保存到该文件的链接
作为一个更高层次的问题,创建一个稍后很容易终止的进程列表的通常方法是什么?Python读取整个源文件,并在执行之前对其进行编译,因此您不必担心删除或更改正在运行的脚本文件。只需不调用 Python不需要对文件持有锁,因为它们是在导入时编译和加载的。实际上,在程序运行时交换文件的功能通常非常有用。IIRC(!):当on*nix时,取消链接只会删除文件系统中的名称,当最后一个文件句柄关闭时,inode会被删除。因此,除了python试图重新打开文件外,这不会导致任何问题 作为一个更高层次的问题,创建稍后容易终止的进程列表的通常方法是什么
我将把PID放在一个
列表中
,然后用os.kill
对其进行迭代。我不明白你为什么要为此创建和执行一个新脚本。如果可以避免的话,不要让你的脚本编写新脚本——只需写出一个PID列表,然后通过它们。
现在还不清楚你想做什么,但是创建和删除脚本听起来太脆弱了
要回答这个问题:
Python编译所有源代码并在执行之前关闭文件,因此这是安全的
通常,在Linux上,解除打开文件的链接是安全的。(但并非无处不在:在Windows上,无法删除正在使用的文件。)
请注意,当您导入模块时,Python 2会将其编译成
.pyc
字节码文件并对其进行解释。如果删除.py
文件,Python仍将使用.pyc
,反之亦然。如果在Linux上删除一个文件,该文件仍然存在,只要至少有一个打开的文件句柄。它不再存在于目录中,但lsof
仍显示为已删除。这个机制是用于临时文件的。我在发布后才看到。然而,我不想删除我的答案。