为什么删除*.py文件时*.pyc文件也被删除?
请看更新在最后。
我正在使用Ubuntu Linux 11.10和Python 3。
我写了一个Python脚本,用来把一些Qt的*.ui文件转换成*.py文件,使用的是pyuic4。然后我想把得到的*.py文件编译成*.pyc文件,并删除*.py文件。
但是奇怪的是,当我删除转换后的*.py文件时,*.pyc文件也被删除了:
try:
command = 'pyuic4 -o /home/vic/ui_form.py /home/vic/form.ui'
output = subprocess.check_output(command, shell= True, stderr= subprocess.STDOUT)
except subprocess.CalledProcessError as e:
print('Failed:', e.output)
else:
print('Converted %s to %s' % (source, targetName))
# convert *.py to *.pyc and delete the source
source = '/home/vic/ui_form.py'
target = source + 'c' # py -> pyc
py_compile.compile(source, target)
#shutil.copy(target, target + '_') # if uncommented - the *.pyc_ file remains
os.remove(source) # if commented - both *.py and *.pyc files remain, otherwise both deleted (?)
我不知道发生了什么(可以查看代码中的注释获取更多信息)。
我想如果能找到是谁删除了这个文件,或许能找到线索——可能是pyuic4在干这事?
有没有办法监控哪个进程在删除文件?
更新:
我一步一步调试。当我执行os.remove(source)
后,两个文件(*.py - 源文件和*.pyc)都被删除了。
这可能是Python的某种行为吗?
4 个回答
1
你可以使用 inotify
来监测文件系统的活动。可以查看相关手册。手册中提到:
IN_DELETE File/directory deleted from watched directory (*).
IN_DELETE_SELF Watched file/directory was itself deleted.
不太确定你是否能知道是谁删除了它。还有一个想法:
chattr +i test.py
可以看看有没有什么命令尝试删除它但失败了(并且给出了错误信息)。
6
你可以通过输入 sysctl -w vm.block_dump=1
来查看所有文件系统的操作记录,这些记录会显示在 dmesg
中。不过这个记录量很大,所以用完后记得要关闭这个功能。
2
我今天一直在为这个问题发愁,结果发现解决办法其实就在身边,不过是个不同的方向:
我在Eclipse这个软件里打开了一个项目。当Eclipse运行时,它会监控新创建的*.py文件(这些文件是从*.ui或*.qrc生成的)。然后,Eclipse会自动把这些文件添加到项目中。
当脚本把*.py文件转换成*.pyc文件并删除原来的*.py文件时,Eclipse也会跟踪这个过程,并小心地删除对应的*.pyc文件。
就这样。