Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Py2运行一个只包含pyc文件的Python包?_Python_Cpython_Pypy - Fatal编程技术网

如何使用Py2运行一个只包含pyc文件的Python包?

如何使用Py2运行一个只包含pyc文件的Python包?,python,cpython,pypy,Python,Cpython,Pypy,使用CPython2,我可以使用Python.exe-c“import mypackage”编译我的Python源代码包。 递归删除所有*.py文件后,我可以使用import mypackage导入它,并像往常一样使用它 使用CPython3,我可以使用Python.exe-m compileall-b“full/path/to/mypackage”编译我的Python源代码pyackage。 递归删除所有*.py文件后,我可以使用import mypackage将其导入。像往常一样使用它 这甚

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

使用CPython3,我可以使用
Python.exe-m compileall-b“full/path/to/mypackage”
编译我的Python源代码pyackage。 递归删除所有
*.py
文件后,我可以使用
import mypackage
将其导入。像往常一样使用它

这甚至可以使用Py3以完全相同的方式完成

令人惊讶的是,当使用Py2时,这不起作用

编译和删除源文件后,我得到以下输出:

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
>>>>
Python 2.7.13(9112C807161412019年2月6日23:10:08)
win32上的[PyPy 7.0.0,带MSC v.1500 32位]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>>导入mypackage
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为mypackage的模块
>>>>
这个问题有解决办法吗


如何让PyPy2像CPython2一样查看
*.pyc
文件?

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

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

出于这个原因,我们很早就决定,CPython的这种行为对我们来说更像是一个bug,并且默认情况下没有在py2中复制它。如果确实需要这种行为,则需要通过传递
--lonepycfile
标志来重新传输PyPy2


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

PyPy是一个JIT编译器,它在加载和运行代码时进行编译/优化。为此,我认为它不会读取*.pyc文件,因为这些文件是专门用于CPython的缓存。@Samat Jain:如上所述,我的测试包括PyPy3,它可以运行仅pyc的包而没有任何缺陷。因此,您的答案不可能是JIT通常不能做到这一点。此外,PyPy自己将
*.py
源文件编译为
*.pyc
文件。如果PyPy没有使用
*.pyc
文件,它会编译哪些文件?非常感谢您的回复。现在我可以理解这种行为的原因了。不幸的是,作为一家非常小的公司,不想发布源代码对我们来说很重要。我们的Python包是一个复杂DLL的包装器,它为客户节省了大量工作和精力。由于客户可以选择他们的Python发行版类型,因此您关于compile选项的提示不幸不适用于我们。但现在我们有了你们的第一手资料,可以做出决定了。非常感谢!