【问题标题】:How can I manually generate a .pyc file from a .py file如何从 .py 文件手动生成 .pyc 文件
【发布时间】:2011-04-09 19:28:20
【问题描述】:

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

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

def py_to_pyc(py_filepath, pyc_filepath):
    ...

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以在终端中使用compileall。以下命令将递归进入子目录并为它找到的所有 python 文件创建 pyc 文件。 compileall 模块是 python 标准库的一部分,所以你不需要安装任何额外的东西来使用它。这对 python2 和 python3 的工作方式完全相同。

    python -m compileall .
    

    【讨论】:

    • 这应该是公认的答案——至少在我需要将所有 *.py 编译成 *.pyc: 递归:)
    • 是否可以分发包含所有使用的库的 PYC 文件?所以用户不必安装它们,只需运行 PYC 文件,我知道在 java 中这可以使用 JARs 是否有任何类似的 Python 方法?
    • 我还听说过 Python 中的元文件。这个compileall还建一些缓存?如果不是,那是什么命令?由于最终用户没有对 lib 目录的写权限。我想在这里加快速度...... PS。还可以查看-O 标志,用于字节码(.pyo 文件 iso .pyc)编译。
    • 反编译呢?
    • 小心这个命令。我确实不小心在我的站点包文件夹上做了一个compileall,它搞砸了一切
    【解决方案2】:

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

    python -m compileall <file_1>.py <file_n>.py
    

    【讨论】:

      【解决方案3】:

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

      import py_compile
      py_compile.compile("file.py")
      

      【讨论】:

      • 您可能希望包含第二个参数,它决定了输出文件。否则,它默认为__pycache__/file.cpython-32.pyc 之类的东西,你会得到它作为返回值。
      【解决方案4】:

      我找到了几种将python脚本编译成字节码的方法

      1. 在终端中使用py_compile

        python -m py_compile File1.py File2.py File3.py ...
        

        -m 指定要编译的模块名称。

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

        python -m py_compile -
        File1.py
        File2.py
        File3.py
           .
           .
           .
        
      2. 使用py_compile.compile

        import py_compile
        py_compile.compile('YourFileName.py')
        
      3. 使用py_compile.main():

        它一次编译多个文件。

        import py_compile
        py_compile.main(['File1.py','File2.py','File3.py'])
        

        列表可以随心所欲地增长。或者,您显然可以在 main 中传递文件列表,甚至可以在命令行 args 中传递文件名。

        或者,如果您在 main 中传递 ['-'],那么它可以交互编译文件。

      4. 使用compileall.compile_dir()

        import compileall
        compileall.compile_dir(direname)
        

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

      5. 使用compileall.compile_file()

        import compileall
        compileall.compile_file('YourFileName.py')
        

      看看下面的链接:

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

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

      【讨论】:

      • 一个小的更正是您正在加载的模块名称是py_compilecompileall 而不是py_compile.pycompileall.py。换句话说,应该是python3 -m py_compile PYTHON_FILENAMEpython3 -m compileall PYTHON_FILES_DIRECTORY
      【解决方案5】:

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

      【讨论】:

      • compileall 不包含跳过对应.pyc 文件已经是最新的文件的逻辑,是吗?
      • @KyleStrand compileall 会跳过已经有最新的.pyc 的文件(使用 Python 2.7.11 测试)
      • @Eponymous 有趣。不知道为什么我不这么认为。感谢您的检查。
      【解决方案6】:

      python2 你应该使用:

      python -m compileall <pythonic-project-name>
      

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


      python3 你应该使用:

      python3 -m compileall <pythonic-project-name>
      

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

      或者this post的褐变:

      您可以在文件夹中强制使用相同的 .pyc 文件布局 Python2 使用:

      python3 -m compileall -b &lt;pythonic-project-name&gt;

      选项-b 触发.pyc 文件的输出到他们的 legacy-locations(即与 Python2 中的相同)。

      【讨论】:

        【解决方案7】:

        为了匹配原始问题要求(源路径和目标路径),代码应该是这样的:

        import py_compile
        py_compile.compile(py_filepath, pyc_filepath)
        

        如果输入代码有错误,则会引发 py_compile.PyCompileError 异常。

        【讨论】:

          【解决方案8】:
          1. 在文件目录下新建一个python文件。
          2. 输入import (the name of the file without the extension)
          3. 运行文件
          4. 打开目录,然后找到pycache文件夹
          5. 里面应该是你的 .pyc 文件

          【讨论】:

            【解决方案9】:

            有两种方法可以做到这一点

            1. 命令行
            2. 使用python程序

            如果您使用命令行,请使用python -m compileall &lt;argument&gt; 将python 代码编译为python 二进制代码。 例如:python -m compileall -x ./*

            或者, 您可以使用此代码将您的库编译为字节码:

            import compileall
            import os
            
            lib_path = "your_lib_path"
            build_path = "your-dest_path"
            
            compileall.compile_dir(lib_path, force=True, legacy=True)
            
            def moveToNewLocation(cu_path):
                for file in os.listdir(cu_path):
                    if os.path.isdir(os.path.join(cu_path, file)):
                        compile(os.path.join(cu_path, file))
                    elif file.endswith(".pyc"):
                        dest = os.path.join(build_path, cu_path ,file)
                        os.makedirs(os.path.dirname(dest), exist_ok=True)
                        os.rename(os.path.join(cu_path, file), dest)
            
            moveToNewLocation(lib_path)
            

            查看☞ docs.python.org 了解详细文档

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-17
              • 2012-06-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多