如何从.py文件手动生成.pyc文件

zJa*_*Jay 115 python

出于某种原因,我不能依赖Python的"import"语句来自动生成.pyc文件

有没有办法实现如下功能?

def py_to_pyc(py_filepath, pyc_filepath):
    ...
Run Code Online (Sandbox Code Playgroud)

Mar*_*agh 225

您可以在终端中使用compileall.以下命令将递归进入子目录,并为它找到的所有python文件生成pyc文件.该compileall模块是Python标准库的一部分,所以你不需要安装任何额外的使用它.这与python2和python3完全相同.

python -m compileall .
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案 - 至少我需要将所有*.py编译成*.pyc:递归:) (4认同)
  • 是否可以分发包含所有使用的库的 PYC 文件?所以用户不必安装它们,只需运行 PYC 文件,我知道在 java 中这可以使用 JAR 来实现,Python 是否有类似的方法? (2认同)
  • 小心这个命令。我不小心在我的 site-packages 文件夹上做了一个 `compileall`,它搞砸了一切 (2认同)

der*_*end 52

您可以使用以下命令从命令行编译单个文件:

python -m compileall <file_1>.py <file_n>.py
Run Code Online (Sandbox Code Playgroud)


Mik*_*ley 50

自从我上次使用Python以来已经有一段时间了,但我相信你可以使用py_compile:

import py_compile
py_compile.compile("file.py")
Run Code Online (Sandbox Code Playgroud)

  • 您可能希望包含第二个参数,该参数确定输出文件.否则,它默认为"__pycache __/file.cpython-32.pyc",你可以将其作为返回值. (7认同)

Abh*_*yap 44

我发现几种将python脚本编译成字节码的方法

  1. 使用py_compile:

    python -m py_compile File1.py File2.py File3.py ...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用-m:

    它一次编译几个文件.

    python -m py_compile -
    File1.py
    File2.py
    File3.py
       .
       .
       .
    
    Run Code Online (Sandbox Code Playgroud)

    只要您愿意,列表就可以增长.或者,您显然可以在命令行参数中传递main或even文件名中的文件列表.

    或者,如果你传入py_compile.compilemain,那么它可以交互式编译文件.

  3. py_compile.main()在终端中使用:

    import py_compile
    py_compile.compile('YourFileName.py')
    
    Run Code Online (Sandbox Code Playgroud)

    ['-'] 指定要编译的模块名称.

    或者,用于交互式编译文件

    import py_compile
    py_compile.main(['File1.py','File2.py','File3.py'])
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用compileall.compile_dir():

    import compileall
    compileall.compile_dir(direname)
    
    Run Code Online (Sandbox Code Playgroud)

    它编译提供的目录中存在的每个Python文件.

  5. 使用compileall.compile_file():

    import compileall
    compileall.compile_file('YourFileName.py')
    
    Run Code Online (Sandbox Code Playgroud)

看看下面的链接:

https://docs.python.org/3/library/py_compile.html

https://docs.python.org/3/library/compileall.html

  • 一个小的更正是您正在加载的模块名称是“py_compile”和“compileall”而不是“py_compile.py”或“compileall.py”。换句话说,它应该是“python3 -m py_compile PYTHON_FILENAME”或“python3 -m compileall PYTHON_FILES_DIRECTORY”。 (2认同)

Pek*_*rck 17

我会用compileall.它从脚本和命令行都很好地工作.它比已经提到的内部使用的py_compile更高级别的模块/工具.

  • @KyleStrand`compileall`会跳过已经具有最新`.pyc`的文件(已通过Python 2.7.11测试) (2认同)

Ben*_*ari 10

python2 中,您可以使用:

python -m compileall <pythonic-project-name>
Run Code Online (Sandbox Code Playgroud)

它将所有.py文件编译为.pyc包含包和模块的项目中的文件。


python3中,您可以使用:

python3 -m compileall <pythonic-project-name>
Run Code Online (Sandbox Code Playgroud)

它将所有.py文件编译到__pycache__包含包和模块的项目中的文件夹。

或者从这篇文章中褐变:

您可以.pyc使用以下命令在文件夹中强制执行与Python2 中相同的文件布局:

python3 -m compileall -b <pythonic-project-name>

该选项-b触发.pyc文件输出到它们的旧位置(即与 Python2 中的相同)。