如何使用 PyPy2 运行 Python 只包含 pyc 文件的包?
How to run a Python package with PyPy2 that only consist out of pyc files?
使用 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
文件?
如您所见,PyPy2 拒绝加载单独的 .pyc
文件,即删除 .py
文件后仍然存在的 .pyc
文件。 PyPy3 的行为类似于 CPython.
PyPy2 的当前状态反映了 PyPy 开发人员对 CPython 细节的不满。在 PyPy 的开发过程中,它常常让我们无法忽视。在我们看来,当您正常开发任何东西时,在删除或重命名 .py 文件后,如果您忘记修复或删除其他文件中的导入语句,您希望看到崩溃。取而代之的是,您看到导入仍在工作,并且这些不相关文件的所有测试仍在通过,因为它们仍在使用相同的旧逻辑。所以你认为你已经完成并检查版本控制系统中的文件---但当然是错误的。
出于这个原因,我们很早就决定 CPython 的这种行为对我们来说更像是一个错误,默认情况下不会在 PyPy2 中重现它。如果你真的需要这种行为,你需要通过传递 --lonepycfile
标志来重新翻译 PyPy2。
PyPy3 后来出现,它带有自己的 importlib
系统,纯 Python,我们没有接触。
使用 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
文件?
如您所见,PyPy2 拒绝加载单独的 .pyc
文件,即删除 .py
文件后仍然存在的 .pyc
文件。 PyPy3 的行为类似于 CPython.
PyPy2 的当前状态反映了 PyPy 开发人员对 CPython 细节的不满。在 PyPy 的开发过程中,它常常让我们无法忽视。在我们看来,当您正常开发任何东西时,在删除或重命名 .py 文件后,如果您忘记修复或删除其他文件中的导入语句,您希望看到崩溃。取而代之的是,您看到导入仍在工作,并且这些不相关文件的所有测试仍在通过,因为它们仍在使用相同的旧逻辑。所以你认为你已经完成并检查版本控制系统中的文件---但当然是错误的。
出于这个原因,我们很早就决定 CPython 的这种行为对我们来说更像是一个错误,默认情况下不会在 PyPy2 中重现它。如果你真的需要这种行为,你需要通过传递 --lonepycfile
标志来重新翻译 PyPy2。
PyPy3 后来出现,它带有自己的 importlib
系统,纯 Python,我们没有接触。