为什么在Windows上的Python 3下创建模块后导入失败?

外汇

以下代码尝试创建然后导入两个模块:

# coding: utf-8

import os
import time

# Remove the modules we're about to create if they already exist
def force_unlink(name):
    try:
        os.unlink(name)
    except OSError:
        pass
force_unlink("print1.py")
force_unlink("print1.pyc")
force_unlink("print2.py")
force_unlink("print2.pyc")
time.sleep(1)

# Create module 1 and module 2, then try to import them just afterwards
print("Creating module 1...")
with open("print1.py", "wb+") as fd:
    fd.write(b'print("Imported module 1")')
import print1
print("Creating module 2...")
with open("print2.py", "wb+") as fd:
    fd.write(b'print("Imported module 2")')
import print2

在Windows上,两种导入都在Python 2(2.7)下工作,但在Python 3(3.5和3.6)下工作:

$ python2 reproduce.py
Creating module 1...
Imported module 1
Creating module 2...
Imported module 2
$ python3 reproduce.py
Creating module 1...
Imported module 1
Creating module 2...
Traceback (most recent call last):
  File "reproduce.py", line 26, in <module>
    import print2
ImportError: No module named 'print2'

time.sleep(5)在每个import printX调用之前添加使其起作用。

这是为什么?

注意:这是我要解决的问题的简单版本

马丁·彼得斯(Martijn Pieters)

我想我知道发生了什么事。新的Python 3导入机制会将在目录中找到的文件名缓存起来。mtime目录的修改时间更改时,它将重新加载缓存

请参见importlib._bootstrap_external.FileFinder.find_spec()方法实现,其中包含:

try:
    mtime = _path_stat(self.path or _os.getcwd()).st_mtime
except OSError:
    mtime = -1
if mtime != self._path_mtime:
    self._fill_cache()
    self._path_mtime = mtime

_path_stat只是一个os.stat()电话,但已本地化以避免导入。_fill_cache()方法执行os.listdir()调用。

在某些Windows文件系统上,的分辨率mtime非常低,最高可达2秒。对于您的情况,分辨率显然仍然很低,以至于您尝试加载第二个模块时缓存都无法更新。尽管NTFS文件系统可以以100ns的增量记录时间,但实际上,限制因素似乎是Windows系统时钟,据我了解,该时钟通常限制为15ms。因此,如果您print2.py在15毫秒内编写print1.py,Python就不会注意到。

Python确实为您提供了清除此缓存的方法。使用importlib.invalidate_caches()方法; 这会将实例_path_mtime属性重置FileFinder-1,从而强制进行新的_fill_cache()调用。

正如该函数的文档所述:

如果在程序运行时创建/安装了任何模块,则应调用此函数,以确保所有查找者都将注意到新模块的存在。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么python virtualenv命令在Windows 10上失败?

Python创建模块

为什么Windows上的Python 3中的winreg中的注册表值不匹配?

从PyHive包导入配置单元后,为什么出现“ ImportError:没有名为内建模块的模块”?

为什么Windows 8上无法安装bcrypt模块?

为什么此脚本在Windows上创建损坏的PNG文件?

为什么共享模块导入失败?

Javascript模块导入失败-为什么?

如何在Windows下使用脚手架创建模块?

为什么子进程在Windows上启动时却在Linux上没有启动时导入主模块?

为什么在Windows下,“ toml.load(f)”在此文件上失败(但在Linux上不是)?

导入后,模块who在Python 3中也不起作用

为什么OSX在Samba共享上而不在Windows文件共享上创建AppleDouble文件?

Windows创建的txt文件上的grep与Mac上的字符串不匹配-为什么?

为什么在Windows上通过多处理模块调用函数时python可执行文件会打开新的窗口实例

使用自制软件安装Python 3后,为什么Mac上的Python无法更新?

停止Python3在系统目录中创建模块缓存

为python3正则表达式创建模块化函数

为什么Git命令在Windows 10上无法通过Win32-OpenSSH失败?

为什么此Perl命令在Windows命令行上失败?

为什么我尝试使用 Visual Studio 工具在 Windows 上构建 OpenSSL 失败?

为什么在Windows 10上的Chocolatey安装过程中7-Zip失败?

为什么Java FileChannel.truncate仅在Windows上可预测地失败?

为什么VirtualBox或VMware无法在Windows 10上启用Hyper-V的情况下运行

为什么默认情况下Windows Server 2008上未启用.NET 3.0?

为什么模块导入实际上不存在?

在Windows上安装后,为什么Java JDK没有设置自己的路径?

为什么在Windows子系统上为Ubuntu启动docker服务后立即关闭它?

在Windows上使用pip成功安装后,Python导入matplotlib失败

TOP 榜单

热门标签

归档