10

我有一个 python 脚本,它导入一些 Python 模块,例如bs4jsonosrequestssignalsystime. 有时我会在我的 PWD 中注意到以下文件:

$ ls -la
-rw-rw-r-- 1 dotancohen dotancohen 12429677 Jun 26 11:37 bs4
-rw-rw-r-- 1 dotancohen dotancohen 12291853 Jun 26 11:36 json
-rwxrwxr-x 1 dotancohen dotancohen     1681 Jun 26 11:51 my-app.py
-rw-rw-r-- 1 dotancohen dotancohen 12291851 Jun 26 11:36 os
-rw-rw-r-- 1 dotancohen dotancohen 12291855 Jun 26 11:36 random
-rw-rw-r-- 1 dotancohen dotancohen 12291851 Jun 26 11:36 re
-rw-rw-r-- 1 dotancohen dotancohen 12429682 Jun 26 11:38 requests
-rw-rw-r-- 1 dotancohen dotancohen     7216 Jun 26 11:38 signal
-rw-rw-r-- 1 dotancohen dotancohen 12291852 Jun 26 11:36 sys
-rw-rw-r-- 1 dotancohen dotancohen 12429678 Jun 26 11:36 time

但是,这些不是 Python 文件,而是似乎是 Postscript 文件。例如:

$ file sys
sys: PostScript document text conforming DSC level 3.0, Level 1

$ head sys
%!PS-Adobe-3.0
%%Creator: (ImageMagick)
%%Title: (sys)
%%CreationDate: (2013-06-26T11:36:13+03:00)
%%BoundingBox: -0 -0 1920 1053
%%HiResBoundingBox: 0 0 1920 1053
%%DocumentData: Clean7Bit
%%LanguageLevel: 1
%%Orientation: Portrait
%%PageOrder: Ascend

我从来没有在这个目录中运行过任何与 Postscript 相关的东西。此外,即使我rm的文件似乎在一段时间后又回来了,所以需要定期创建它们。看到它们与在此目录中的 Python 脚本中导入的 Python 模块具有相同的名称,我怀疑相关性。可能是什么原因?

4

1 回答 1

20

我会对此进行尝试... 这看起来就像我有时在不指定 Python 解释器的情况下意外调用脚本时看到的,例如,我说./foo.py而不是,或者在脚本的开头python foo.py没有一行。#!当我这样做时,脚本在一段时间后因语法错误而失败,并且目录中充满了名为 sys、os、time的文件——正是我在脚本中导入的模块。这些新文件相当大(7MB)。执行head sys显示的文件内容与您的基本相同。我使用 Linux (Ubuntu) 并且没有 IDE 用于我的 Python 开发,只是一个 bash shell。

这就是我认为正在发生的事情,至少在 Linux 上:如果你这样做man import,你会看到

import - 将任何可见窗口保存在 X 服务器上并将其输出为图像文件。您可以捕获单个窗口、整个屏幕或屏幕的任何矩形部分。

[...]

导入程序是 ImageMagick(1) 工具套件的成员。使用它来捕获部分或全部 X 服务器屏幕并将图像保存到文件中。

所以我猜测shell将Pythonimport语句的第一行解释为/usr/bin/import命令,并使用“参数”(模块名称)作为要保存的图像文件的名称。因此文件顶部的 PS / ImageMagick 内容。

再说一次,我只在偶尔腾出空间并在没有 Python 解释器的情况下调用我的脚本时才看到这一点。由于我不知道您的代码或使用条件,我不能保证这是您的确切问题,但我猜您正在做类似的事情(可能是在不知不觉中)。我希望这会有所帮助,并让您走上正轨。

编辑: 这是一个基本上重现您的问题的实验。代码:

import sys
import random
import os
import time
import signal

def main():
    sys.stdout.write('foo\n')

if (__name__ == "__main__"):
    main()

我在没有 Python 的情况下调用它:

./foo.py 
./foo.py: line 8: syntax error near unexpected token `('
./foo.py: line 8: `def main():'

新文件在那里:

$ ls
total 25096
-rwxr-xr-x 1 doug doug     146 2013-06-27 10:31 foo.py
-rw-r--r-- 1 doug doug 7291759 2013-06-27 10:12 os
-rw-r--r-- 1 doug doug 7291763 2013-06-27 10:12 random
-rw-r--r-- 1 doug doug 1903418 2013-06-27 10:32 signal
-rw-r--r-- 1 doug doug 1903415 2013-06-27 10:32 sys
-rw-r--r-- 1 doug doug 7291761 2013-06-27 10:12 time

看看它们的内容:

$ head sys
%!PS-Adobe-3.0
%%Creator: (ImageMagick)
%%Title: (sys)
%%CreationDate: (2013-06-27T10:32:20-05:00)
%%BoundingBox: 0 0 663 471
%%HiResBoundingBox: 0 0 663 471
%%DocumentData: Clean7Bit
%%LanguageLevel: 1
%%Orientation: Portrait
%%PageOrder: Ascend

再次,我希望这能带来一些启发并有所帮助。

于 2013-06-27T15:29:04.040 回答