如何在导入其他.py文件时运行.pyc文件



main.py

import other
def main():
other.test()
main()

其他.py

def test():
print("Hello")

通过使用python3 -m py_compile *.py,我可以拥有2个.pyc文件。

但是,如果有no module named othermain.pyc就无法运行,这是我从终端得到的错误。

这个想法是将整个项目从.py编译到.pyc,这样人们就可以在不共享源代码的情况下运行它们。

那么,如何在不共享源代码的情况下运行这个导入其他库的main.pyc

这也可以通过以下命令实现:

python -m compileall -b .

询问了一个机器学习小组。这是我的发现。只要把main.pyother.py编译成main.pycother.pyc,我就可以用python3 main.pyc运行它。

在此之前,我的python会自动将other.py转换为other.cpython-35.pyc。在这种情况下,main.pyc不能import other,因为文件夹中没有other(现在称为other.cpython-35)。

因此,请确保.pyc文件与.py具有相同的名称,然后您可以运行它们中的任何一个,并且在执行命令时python将为您包含.pyc文件。

简短回答

当旁边有源文件时,Python会忽略pyc文件。因此,在生成main.pycother.pyc之后,请确保源文件main.pyother.py移出目录。

能够使用pyc而不是py文件。

  • 编译的pyc文件应与源文件位于同一文件夹中
  • pyc的文件名应与源文件相同
  • pyc旁边不应再存在源py文件

长答案

Python执行将源py文件编译为已编译的pyc文件,即使没有明确请求。

  • Legacy Python将在与源py文件相同的目录中创建具有相同名称的pyc文件
  • 较新版本在名为CCD_ 38的文件夹中创建CCD_;魔术串";基于Python版本。例如foo.cpython-37.pyc

因此,在较新版本的Python中,

  • 必须重命名pyc以删除幻数foo.cython-37.pycfoo.pyc
  • pyc文件必须从__pycache__文件夹移动到父源文件夹

可以使用compileall模块实现上述功能,默认情况下,该模块应存在于Python安装中。

python -m compileall -b .

-b标志将字节码文件写入其遗留位置和名称,这可能会覆盖由另一版本的Python创建的字节码文件。默认情况是将文件写入它们的PEP 3147位置和名称,这允许来自多个版本的Python的字节码文件共存。

参考文献

PEP 3147–PYC存储库目录提供了对pypyc文件的深入了解。

以下是一些相关部分。

背景

CPython将其源代码编译为"字节码",以提高性能原因,每当源文件已更改。这使得Python模块的加载非常频繁更快,因为可以绕过编译阶段。

建议书

Python的导入机制扩展为编写和搜索字节每个Python包内的单个目录中的代码缓存文件目录此目录将被称为pycache

此外,pyc文件名将包含一个魔术字符串(称为"标记")这与它们编译的Python版本不同。这允许多个字节编译的缓存文件共存于一个Python源文件。

Python行为-案例3:pycache/foo。。无源的pyc

foo.py文件可能以某种方式被删除,同时离开缓存的pyc文件仍在文件系统中。如果pycache/foo。。pyc文件存在,但用于创建它的foo.py文件不存在,Python将在被要求时引发ImportError导入foo。换句话说,Python不会从缓存目录,除非源文件存在。

Python行为-案例4:遗留pyc文件和无源导入

Python将在下一个源文件存在时忽略所有遗留pyc文件换句话说,如果foo.py旁边有一个foo.pyc文件文件,pyc文件在所有情况下都将被忽略

为了继续支持无源发行版,如果源文件丢失,Python将导入一个单独的pyc文件位于源文件所在的位置。

最新更新