我试图在不保留.py
个源文件的情况下运行Python应用程序,并且只依赖.pyc
个编译文件.但是,当我删除.py
个源文件时,会出现导入错误.这个功能在Python2.7中可以使用,但在3.4中不能使用(使用新的__pycache__
struct ).
下面是一个示例目录 struct :
package/ __init__.py module.py
Python 2.7
首先,让我们看看当我使用Python 2.7时会发生什么(这是所需的行为)
$ python2 -c "from package import module"
$ find package -name "*.py" -delete
$ python2 -c "from package import module"
一切都很好,没有错误.执行此操作后的目录 struct 如下所示,.pyc
个文件与原始的.py
个文件并列:
package/ __init__.pyc module.pyc
Python 3.4
现在,让我们对Python3.4做同样的事情,再次从原始目录 struct 开始
$ 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"
,但它无法从那里获取任何模块.此时,目录 struct 看起来与2.7中的略有不同,具体如下:
package/ __pycache__/ __init__.cpython-34.pyc module.cpython-34.pyc
所以问题是:为什么Python3.4在只有.pyc
个文件的情况下不能正确导入/执行?这是一种期望的行为吗?也就是说,在所有情况下都必须保留来源?还是我错过了什么蠢事?