在Python中调用os.unlink(__ file__)是否安全?

时间:2011-11-30 22:09:32

标签: 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
import time
time.sleep(10)       # sleep 1
os.unlink(__file__)
time.sleep(10)       # sleep 2

我在运行此文件时运行stat kill.py且链接数始终为1,所以我猜Python解释器没有链接到该文件。

作为一个更高层次的问题,创建一个稍后要被杀死的进程列表的常用方法是什么?

5 个答案:

答案 0 :(得分:2)

如果你可以避免脚本,就不要让你的脚本编写新脚本 - 只需写出一个PID列表,然后通过它们。 它并不是很清楚你想要做什么,但创建和删除脚本听起来就像是一个太脆弱的魔法。

回答这个问题:

,Python会编译所有源并在执行前关闭文件,因此这是安全的。

通常,在Linux上取消链接打开的文件是安全的。 (但不是无处不在:在Windows上,您无法删除正在使用的文件。)

请注意,当您import模块时,Python 2会将其编译为.pyc字节码文件并对其进行解释。如果删除.py文件,Python仍将使用.pyc,反之亦然。

答案 1 :(得分:1)

请勿拨打reload

Python不需要对文件进行锁定,因为它们是在导入时编译和加载的。实际上,在程序运行时交换文件的能力通常非常有用。

答案 2 :(得分:1)

IIRC(!):当在* nix上时,unlink仅删除文件系统中的名称,当最后一个文件句柄关闭时,将删除inode。因此,除了python尝试重新打开文件之外,这不会引起任何问题。

答案 3 :(得分:1)

  

作为一个更高层次的问题,创建一个稍后要被杀死的进程列表的常用方法是什么?

我会将PID放在list中并使用os.kill进行迭代。我不明白为什么要为此创建和执行新脚本。

答案 4 :(得分:0)

Python读取整个源文件并在执行之前编译它,因此您不必担心删除或更改正在运行的脚本文件。