【问题标题】:calling precompiled module from another file从另一个文件调用预编译模块
【发布时间】:2018-08-16 12:39:22
【问题描述】:

我主要是 C++ 开发人员,尝试使用 python 为我完成某些任务。 我在 python 3.6 中制作了一个 python 模块,并使用以下命令在 windows 7 中预编译了它

 python -m py_compile myfile.py

使用来自this 链接的信息。我创建了“myfile.pyc”

现在我想在使用 python 2.7 的 python 文件中使用它 所以,我使用来自thisthis 的信息并写

mod=imp.load_source('myfile.func', 'c:/folder1/folder2/myfile.pyc')

但上面的说法给了我例外

[name 'o' is not defined]

这是因为我在 3.6 中使用预编译并在 2.7 中使用吗?

我错过了什么

【问题讨论】:

  • 为什么要预编译代码?将代码直接用作模块并让 python 解释器缓存并为您编译它可能更容易。同样一般 3.X 和 2.X 不兼容,但我不知道它们的字节码是否兼容,但它可能不兼容
  • 我问你为什么预编译它主要是因为预编译只节省编译时间,代码本身的运行速度与你定期导入它的速度相同,然后两个代码库将在同一个 python 上编译环境
  • @GarriganStafford :实际上,我编写的代码包含一些算法,这些算法是我正在工作的组织的 IP。我插入lib的代码是一些开源代码。因此,预编译/加密。
  • 好的,那么您很可能必须确保您使用的 python 版本与库相同。另请查看我所说的关于 load_compiled 的内容,这有帮助吗?

标签: python import pre-compilation


【解决方案1】:

第一个 python 3.6 不向后兼容 python 2.7。其次,通常更好地导入模块并让编译器将缓存库代码作为编译字节码处理。此外,函数load_source 用于加载未编译的源文件,您想要的函数是load_compiled。在这里检查 https://docs.python.org/2/library/imp.html

最后,如果您正在寻找性能改进,这只会有助于减少编译时间,并且仅在第一次编译或导入的文件更改时。

What is __pycache__?

【讨论】:

  • 您好,我采纳了您的建议,现在,之前的问题已经消失了。谢谢。
  • 但是,现在我得到了这个执行:“C:/bm_server/cc/LineDetect.pyc 中的魔法数字错误”==> 这似乎是一个问题:stackoverflow.com/questions/514371/…跨度>
  • pyc编译的是什么版本,你运行的是什么版本?
  • 谢谢,我在 P27 中编译,并使用了“imp.load_compiled”。它解决了问题。
【解决方案2】:

这是我的问题的完整解决方案。 (如果您不想浏览所有评论和讨论并找出解决方案)

正如 Garrigan Stafford 先生恰当地指出,我在加载模块时使用了错误的 API。

加载已编译模块的 API 是 load_compiled 而不是 load_source

当我开始使用这个 API 时,遇到了幻数错误:Bad magic number。 发生这种情况是因为在创建文件时,编译器会插入某些值来基本上识别它是什么文件。 (更多信息:can be found here.)。

在我的情况下,编译我的库是 3.6 并在 2.7 中使用,这导致了问题。 为了克服,我基本上回到了原始代码并在 2.7 中编译了我的库,然后在客户端代码中使用它。

沃拉!!!!

现在一切正常。

感谢整个 stackoverflow 社区,特别感谢 Stafford 先生的帮助。

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2014-07-28
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多