如何使用仅包含 pyc 文件的 PyPy2 运行 Python 包?

Gah*_*eld 4 python pypy cpython

使用 CPython2 我可以编译我的 Python 源代码包python.exe -c "import mypackage"*.py递归删除所有文件后,我可以简单地导入它import mypackage并像往常一样使用它。

使用 CPython3 我可以编译我的 Python 源代码 pyckage python.exe -m compileall -b "full/path/to/mypackage"*.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
>>>>
Run Code Online (Sandbox Code Playgroud)

这个问题有解决方法吗?

我如何告诉 PyPy2*.pyc像 CPython2 那样只查看文件?

Arm*_*igo 6

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

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

出于这个原因,我们很早就决定 CPython 的这种行为对我们来说更像是一个错误,并且默认情况下不会在 PyPy2 中重现它。如果你真的需要这种行为,你需要通过传递--lonepycfile标志来重新翻译 PyPy2 。

PyPy3 后来出现,它带有自己的importlib系统,纯 Python,我们没有接触过。