main.py
import other
def main():
other.test()
main()
其他.py
def test():
print("Hello")
通过使用python3 -m py_compile *.py
,我可以拥有2个.pyc文件。
但是,如果有no module named other
,main.pyc
就无法运行,这是我从终端得到的错误。
这个想法是将整个项目从.py
编译到.pyc
,这样人们就可以在不共享源代码的情况下运行它们。
那么,如何在不共享源代码的情况下运行这个导入其他库的main.pyc
呢
这也可以通过以下命令实现:
python -m compileall -b .
询问了一个机器学习小组。这是我的发现。只要把main.py
和other.py
编译成main.pyc
和other.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.pyc
和other.pyc
之后,请确保源文件main.py
和other.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.pyc
到foo.pyc
pyc
文件必须从__pycache__
文件夹移动到父源文件夹
可以使用compileall
模块实现上述功能,默认情况下,该模块应存在于Python安装中。
python -m compileall -b .
-b
标志将字节码文件写入其遗留位置和名称,这可能会覆盖由另一版本的Python创建的字节码文件。默认情况是将文件写入它们的PEP 3147位置和名称,这允许来自多个版本的Python的字节码文件共存。
参考文献
PEP 3147–PYC存储库目录提供了对py
和pyc
文件的深入了解。
以下是一些相关部分。
背景
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文件位于源文件所在的位置。