删除关联的* .py文件时,为什么要删除* .pyc文件

时间:2011-10-27 10:31:21

标签: linux ubuntu file python process

请参阅最后的更新。

我使用的是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行为吗?

4 个答案:

答案 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。我没有尝试过,但它可能会有所帮助。