使用CPython2,我可以使用python.exe -c "import mypackage"
编译我的Python源代码包。
递归删除所有*.py
文件后,我可以简单地将其与import mypackage
一起导入并照常使用。
使用CPython3,我可以使用python.exe -m compileall -b "full/path/to/mypackage"
编译我的Python源代码pyckage。
递归删除所有*.py
文件后,我可以简单地使用import mypackage
导入它。并照常使用。
甚至可以使用完全相同的方式使用PyPy3完成此操作。
令人惊讶的是,当使用PyPy2时,它不起作用!
编译并删除源文件后,我得到以下输出:
Python 2.7.13 (9112c8071614, Feb 06 2019, 23:10:08)
[PyPy 7.0.0 with MSC v.1500 32 bit] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>> import mypackage
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named mypackage
>>>>
是否有解决此问题的方法?
如何告诉PyPy2像CPython2一样查看*.pyc
文件?
欢迎每一项建设性贡献!
答案 0 :(得分:2)
如您所见,PyPy2拒绝加载单独的.pyc
文件,即删除.pyc
文件后仍然存在的.py
文件。 PyPy3的行为类似于CPython。
PyPy2的当前状态反映了使用CPython的这一细节的PyPy开发人员的烦恼。在PyPy的开发过程中,它经常咬我们,以至于无法忽视。我们的观点是,当您通常在开发任何东西时,删除或重命名.py文件后,如果忘记修复或摆脱其他文件中的import语句,则希望看到崩溃。取而代之的是,您会看到导入仍然有效,并且针对这些不相关文件的所有测试仍然通过,因为它们仍然使用相同的旧逻辑。因此,您认为已经完成并签入了版本控制系统中的文件-但这当然是错误的。
由于这个原因,我们很早就决定CPython的行为对我们而言更像是一个错误,并且默认情况下未在PyPy2中重现它。如果您确实需要这种行为,则需要通过传递--lonepycfile
标志来重新翻译PyPy2。
PyPy3后来出现了,它带有纯Python的importlib
系统,我们没有碰过。