【问题标题】:How to run a Python package with PyPy2 that only consist out of pyc files?如何使用仅包含 pyc 文件的 PyPy2 运行 Python 包?
【发布时间】:2019-04-03 09:09:59
【问题描述】:

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

【问题讨论】:

  • PyPy 是一个 JIT 编译器,它在代码加载和运行时进行编译/优化。为此,我认为它不会读取 *.pyc 文件,因为这些文件是专门为 CPython 缓存的。
  • @Samat Jain:如上所述,我的测试包括 PyPy3,它可以运行纯 pyc 包而没有任何缺陷。因此,您的答案不可能是 JIT 通常 a 无法做到这一点。此外,PyPy 会自行将*.py 源文件编译为*.pyc 文件。如果 PyPy 不使用 *.pyc 文件,它会编译它们吗?

标签: python cpython pypy


【解决方案1】:

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

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

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

PyPy3 出现得较晚,它带有自己的importlib 系统,使用纯 Python,我们没有接触过。

【讨论】:

  • 非常感谢您的回复。现在我可以理解这种行为的原因了。不幸的是,作为一家非常小的公司,不想分发源代码对我们来说很重要。我们的 Python 包是一个复杂 DLL 的包装器,它为客户节省了大量的工作和头疼的事情。由于客户可以选择他们的 Python 分发类型,因此很遗憾,您使用 compile 选项的提示对我们不起作用。但是现在我们可以确定您是第一手,并且可以做出决定。非常感谢!
猜你喜欢
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2013-03-02
相关资源
最近更新 更多