在网络上并发运行Python脚本,可以吗?
我们有一个Python脚本和相关的模块保存在一个网络驱动器上。我们同时从几台电脑上运行这个脚本。
有时候,其中一台电脑会随机出现错误,像这样:
Traceback (most recent call last):
File "\\chifs02.int.tt.local\group\Development\Server Products\Automation\repos\mksutils\fetch.py", line 16, in <module>
from scripts import write_set_environment
NameError: Can't find file for module scripts
(filename \\chifs02.int.tt.local\group\Development\Server Products\Automation\repos\mksutils\scripts.pyc)
我注意到一个奇怪的现象,就是这个.py文件几个月前才被修改过,而.pyc文件却只有几个小时前的时间戳,尽管从那以后每天都在运行这个脚本。
我之前从未见过这个 NameError: Can't find file for module scripts
错误,谷歌搜索也没找到什么有用的信息。
参与的所有电脑都在运行Windows系统。
2 个回答
2
这个错误挺奇怪的(我在实际使用中从没见过)。
我猜测可能是因为一个节点在重新生成 pyc
文件的时候,另一个节点正试图去查看这个文件。可以尝试删除 pyc
文件,然后在 Python 命令行中加上 -B
选项:
-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x
4
别这么做,"这么做"指的是让多个电脑同时使用同一个 .pyc 文件。
出现 .pyc 文件被修改的原因很可能是因为你在不同的电脑上使用了稍微不同版本的 Python。一个电脑生成了它自己的 .pyc 文件,另一个电脑发现这个文件和它预期的不一样,于是又生成了自己的版本。
如果不同的电脑同时在处理同一个 .pyc 文件,出现奇怪的错误是完全有可能的。这种情况会导致竞争条件,因为没有任何锁定机制来防止这种情况发生。
要么让每台电脑在运行脚本之前先把脚本复制到本地,要么禁用 .pyc 文件的生成(可以使用 -B 命令行参数或者设置 PYTHONDONTWRITEBYTECODE 环境变量)。