请参阅最后的更新。
我使用的是Ubuntu Linux 11.10,Python 3.
我写了一个Python脚本,它使用pyuic4将一些Qt * .ui文件转换为* .py。然后我想将获得的* .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 (?)
我不知道发生了什么(请参阅代码中的注释以获取更多信息)。
如果我发现WHO删除了文件,我想我会有一个提示 - 也许是pyuic4?
我有可能监控哪个进程删除文件吗?
更新
我正在逐步调试。执行os.remove(source)
后,两个文件(* .py - source和* .pyc)都将被删除。
这可能是一些Python行为吗?
答案 0 :(得分:6)
您可以设置sysctl -w vm.block_dump=1
以查看dmesg
中的每个文件系统操作。 (高音量,所以之后再次禁用)
答案 1 :(得分:1)
您可以使用inotify
来检测文件系统活动。请参阅手册。引用手册:
IN_DELETE File/directory deleted from watched directory (*).
IN_DELETE_SELF Watched file/directory was itself deleted.
不确定是否可以删除谁。另一个想法:
chattr +i test.py
并查看某个命令是否尝试删除它(并给出错误消息)。
答案 2 :(得分:1)
我在这个问题上整天都在发疯,并且,正如经常发生的那样,解决方案已经接近,但却是另一种解决方案:
我在Eclipse中打开了这个项目。当Eclipse打开时,它会跟踪新* .py文件的创建(来自* .ui或* qrc)。然后Eclipse会自动将它们添加到项目中。
当脚本将* .py文件转换为* .pyc并删除* .py文件时 - Eclipse也会跟踪它并小心删除相应的* .pyc文件。
就是这样。
答案 3 :(得分:0)
您可以尝试使用auditd。我没有尝试过,但它可能会有所帮助。