【问题标题】:Where does PyCharm store compiled files?PyCharm 在哪里存储编译文件?
【发布时间】:2018-04-13 15:35:03
【问题描述】:

我是 PyCharm/Python 的新手,不知道 IDE 将编译后的 python *.pyc 文件存储在哪里。

来自 IntelliJ 世界,奇怪的是我没有看到任何用于重新构建项目或构建单个文件的菜单选项。

我在搜索项目目录时也找不到任何pyc文件,所以基本上我不知道是否编译成功,尽管GitHub导入的项目没有错误。

我可以在这里做什么?

【问题讨论】:

    标签: python pycharm


    【解决方案1】:

    由于大多数 Python 实现都是解释而不是编译的,因此编译步骤会在您运行代码时发生。这就是为什么 PyCharm UI 具有突出的“运行”按钮 (▶️) 但没有编译按钮的原因。

    CPython 确实有一个从 Python 代码编译为字节码的编译步骤,但这是一个实现细节。 CPython 3 将其缓存的编译结果存储在名为__pycache__ 的目录中的.pyc 文件中。这些文件是在导入模块时自动生成的(使用import module 将生成module.pyc 文件),但在运行普通程序时不会自动生成。

    最后,根据@shmee 的评论,可以使用py_compile 模块编译源文件,但我要强调的是,这通常不需要或不需要。

    现在,如果您担心检查您的代码是否正确,那么在解释性语言世界中,我们更加依赖测试。我建议您调查代码测试(使用 pytest 和 PyCharm 中出色的 test integration)。

    【讨论】:

    • 实际上,如果您愿意,您可以简单地编译源文件:py_compile。另外值得一提的是,解释器只在导入时编译模块。因此,如果您有一个从未被另一个模块导入的模块,则默认情况下它永远不会有 .pyc
    • @shmee 我已经在 CPython 编译时提到过。我还添加了关于 py_compile 的注释,谢谢。
    • Nitpick:语言不是编译或解释的,语言实现是。
    • @juanpa.arrivillaga 我已经改写了,但我必须说打电话谈论interpreted languages 是很常见的。你知道编译好的 Python 实现吗?我觉得这种语言的动态特性不适合编译。
    • 它可能会扩展“实现”的定义,但Cython 可以归类为“Python 编译器”。
    【解决方案2】:

    让我从一些术语开始:

    • Python 是一种编程语言。它“只是”programming language specification

    • CPython 是 Python 语言的参考实现。它实际上只是几种不同的 Python 解释器之一。 CPython 本身通过将导入的 Python 文件/模块中的代码翻译(但您也可以说编译)字节码然后执行该字节码来工作(我们称之为实现细节)。它实际上将翻译作为.pyc 文件存储在file 的文件夹中,以使后续导入更快,但这是特定于CPython 的,也可以是disabled

    • PyCharmintegrated development environment。但是它需要"Configure a Python Interpreter" 才能运行 Python 代码。

    这意味着 PyCharm 不负责创建 .pyc 文件。如果您配置了非 CPython 解释器或使用环境变量禁用 pyc 文件创建,则不会有任何 pyc 文件。

    但是,如果您在 PyCharm 中使用了适当的 CPython 解释器,它将为您成功导入的文件/模块创建 .pyc 文件。这意味着您实际上必须在项目中导入或以其他方式运行 Python 文件才能获取 .pyc 文件。

    实际上 Python 文档中包含一个关于 "compiled" Python files 的注释:

    为了加快加载模块,Python将每个模块的编译版本缓存在__pycache__目录下的module.version.pyc名称下,其中版本编码了编译文件的格式;它通常包含 Python 版本号。例如,在 CPython 3.3 版中,spam.py 的编译版本将被缓存为__pycache__/spam.cpython-33.pyc。这种命名约定允许来自不同版本和不同 Python 版本的编译模块共存。

    Python 会根据编译后的版本检查源代码的修改日期,以查看它是否已过期并需要重新编译。这是一个完全自动的过程。此外,编译后的模块是平台无关的,因此同一个库可以在不同架构的系统之间共享。

    Python 在两种情况下不检查缓存。首先,它总是重新编译并且不存储直接从命令行加载的模块的结果。其次,如果没有源模块,它不会检查缓存。要支持非源(仅编译)分发,编译模块必须在源目录中,并且不能有源模块。

    给专家的一些提示:

    • 您可以使用 Python 命令上的-O-OO 开关来减小已编译模块的大小。 -O 开关删除断言语句,-OO 开关删除断言语句和 doc 字符串。由于某些程序可能依赖这些可用的程序,因此只有在知道自己在做什么的情况下才应使用此选项。 “优化”模块有一个 opt- 标签,通常更小。未来的版本可能会改变优化的效果。
    • .pyc 文件中读取程序的运行速度不会比从.py 文件中读取时快;唯一比 .pyc 文件更快的是它们的加载速度。
    • 模块compileall可以为目录中的所有模块创建.pyc文件。
    • PEP 3147 中提供了有关此过程的更多详细信息,包括决策流程图。

    【讨论】:

    • 根据我的理解,编译成字节码是 CPython 运行时的必要部分,但是,.pyc 文件的保存是可选的,以缩短启动时间
    • @juanpa.arrivillaga 是的,我也这么认为。我的意思是保存可以禁用的pyc文件。
    猜你喜欢
    • 2017-02-11
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多