我正在尝试在不保留.py
源文件的情况下运行 Python 应用程序,而只依赖已.pyc
编译的文件。但是,当我删除.py
源文件时出现导入错误。此功能在 Python 2.7 中有效,但在 3.4(具有新__pycache__
结构)中无效。
这是一个示例目录结构:
package/ __init__.py module.py
蟒蛇 2.7
首先让我们看看当我使用 Python 2.7 时会发生什么(这是期望的行为)
$ python2 -c "from package import module"
$ find package -name "*.py" -delete
$ python2 -c "from package import module"
一切都很好,没有错误被抛出。执行此操作后的目录结构如下所示,.pyc
文件与原始.py
文件一起:
package/ __init__.pyc module.pyc
蟒蛇 3.4
现在,让我们对 Python 3.4 做同样的事情,再次从我们原来的目录结构开始
$ python3 -c "from package import module"
$ find package -name "*.py" -delete
$ python3 -c "from package import module"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: cannot import name 'module'
哦哦,它不能导入模块。有趣的是,此时我仍然可以安全地运行python3 -c "import package"
,但它无法从那里抓取任何模块。此时,目录结构看起来与 2.7 中的有些不同,具体如下:
package/ __pycache__/ __init__.cpython-34.pyc module.cpython-34.pyc
所以问题是这样的:为什么 Python 3.4 不能仅在给定.pyc
文件的情况下正确导入/执行?这是期望的行为,意味着在所有情况下都必须保留源吗?还是我错过了一些愚蠢的东西?