如何使用仅由pyc文件组成的PyPy2运行Python包?

时间:2019-04-03 09:09:59

标签: python cpython pypy

使用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文件?

欢迎每一项建设性贡献!

1 个答案:

答案 0 :(得分:2)

如您所见,PyPy2拒绝加载单独的.pyc文件,即删除.pyc文件后仍然存在的.py文件。 PyPy3的行为类似于CPython。

PyPy2的当前状态反映了使用CPython的这一细节的PyPy开发人员的烦恼。在PyPy的开发过程中,它经常咬我们,以至于无法忽视。我们的观点是,当您通常在开发任何东西时,删除或重命名.py文件后,如果忘记修复或摆脱其他文件中的import语句,则希望看到崩溃。取而代之的是,您会看到导入仍然有效,并且针对这些不相关文件的所有测试仍然通过,因为它们仍然使用相同的旧逻辑。因此,您认为已经完成并签入了版本控制系统中的文件-但这当然是错误的。

由于这个原因,我们很早就决定CPython的行为对我们而言更像是一个错误,并且默认情况下未在PyPy2中重现它。如果您确实需要这种行为,则需要通过传递--lonepycfile标志来重新翻译PyPy2。

PyPy3后来出现了,它带有纯Python的importlib系统,我们没有碰过。