【问题标题】:Why *.pyc files are being deleted when the associated *.py file is deleted为什么在删除关联的 *.py 文件时会删除 *.pyc 文件
【发布时间】:2011-12-16 10:16:06
【问题描述】:

见最后更新。

我使用的是 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 (?)

我不知道发生了什么(有关更多信息,请参阅代码中的 cmets)。

如果我发现 WHO 删除了文件,我想我会有提示 - 也许是 pyuic4?

是否有可能监控哪个进程删除了文件?


更新:

我是一步一步调试的。执行os.remove(source) 后,两个文件(*.py - source 和 *.pyc)都被删除。

这可能是某种 Python 行为吗?

【问题讨论】:

  • source=target - 所以最初的目标是你的 .py 文件?这是在哪里初始化的?为什么你有targettargetName
  • 对不起,我从一个更大的代码中得到了这个。我会简化这个。
  • 编码时注意复制粘贴。 很多错误来自复制粘贴代码,而没有真正关注正在做什么。使用通用模块而不是复制粘贴。这个恕我直言也更适合 StackOverflow。
  • 使用 strace -f 在日志中搜索 unlink。
  • strace -f 帮助 - 它显示了 unlink 调用,但只有 *.py 文件被删除。是否存在竞争条件,即在 *.py 被删除并且 *.pyc 也被操作系统删除时编译 *.py -> *.pyc 未完成?

标签: linux ubuntu file python process


【解决方案1】:

您可以设置sysctl -w vm.block_dump=1 以查看dmesg 中的每个文件系统操作。 (音量大,以后再禁用)

【讨论】:

    【解决方案2】:

    您可以使用inotify 来检测文件系统活动。请参阅手册。引用手册:

           IN_DELETE         File/directory deleted from watched directory (*).
           IN_DELETE_SELF    Watched file/directory was itself deleted.
    

    不确定您是否可以找到删除它的人。另一个想法:

    chattr +i test.py
    

    并查看是否有某个命令尝试删除它失败(并给出错误消息)。

    【讨论】:

      【解决方案3】:

      我整天都在为这个问题发疯,而且,正如它经常发生的那样,解决方案就在附近,但类型不同:

      我在 Eclipse 中打开了这个项目。当 Eclipse 打开时,它会跟踪新 *.py 文件的创建(来自 *.ui 或 *qrc)。然后 Eclipse 会自动将它们添加到项目中。

      当脚本将 *.py 文件转换为 *.pyc 并删除 *.py 文件时 - Eclipse 也会跟踪并小心删除相应的 *.pyc 文件。

      原来如此。

      【讨论】:

        【解决方案4】:

        您可以尝试使用auditd。我没有尝试过,但它可能会有所帮助。

        【讨论】:

          猜你喜欢
          • 2011-02-01
          • 1970-01-01
          • 2014-02-27
          • 1970-01-01
          • 2011-05-17
          • 1970-01-01
          • 1970-01-01
          • 2015-05-13
          • 1970-01-01
          相关资源
          最近更新 更多