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

问题描述 投票:3回答:1

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

我们欢迎每一个建设性的贡献!

python cpython pypy
1个回答
3
投票

正如您所发现的,PyPy2拒绝加载行qazxsw poi文件,即删除.pyc文件后仍然存在的qazxsw poi文件。 PyPy3的行为与CPython相似。

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

出于这个原因,我们很早就决定CPython的这种行为更像是我们的错误,并且在PyPy2中没有默认重现它。如果您确实需要此行为,则需要通过传递.pyc标志来重新转换PyPy2。

PyPy3后来出现,它带有自己的.py系统,纯Python,我们没有触及。

© www.soinside.com 2019 - 2024. All rights reserved.