【问题标题】:Importing python module using bytecode with out source使用没有源代码的字节码导入python模块
【发布时间】:2016-11-24 07:13:47
【问题描述】:

来自python书:

学习 Python。第 5 版,第 727 页

我读到以下内容:

如果 Python 在搜索路径中只找到一个字节码文件,而没有找到 source,它只是直接加载字节码;这意味着你可以 将程序仅作为字节码文件发送并避免发送源代码

但是在 Python 3.5 上尝试相同的操作时,它不起作用:

~/Python/Module_Test$ cat a.py
a = "abc"
l = [1,2,3]

导入模块'a' 创建字节码文件为:

~/Python/Module_Test/__pycache__$ ls
a.cpython-35.pyc

现在我删除了'a.py' 文件并从字节码目录中导入模块'a'

~/Python/Module_Test/__pycache__$ python
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'a'

我什至尝试将字节码目录添加到搜索路径中,但仍然无法加载模块:

>>> import sys
>>> sys.path.append('/home/pradeep/Python/Module_Test/__pycache__')
>>> import a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'a'

我做错了什么?我们可以在没有源代码的情况下从字节码导入模块吗?是不是我对书上的说法理解错了?

【问题讨论】:

  • 我不使用 Anaconda,但是当使用标准 CPython 解释器时,字节码文件名与源文件名相同,并附加了“c”,即“a.py”编译为“ a.pyc”。尝试创建一个名为“a.pyc”到“a.cpython-35.pyc”的链接,或者简单地将“a.cpython-35.pyc”重命名为“a.pyc”,看看会发生什么。
  • 这是我所知道的@PM2Ring 的标准 Python 行为,修改名称,以便您可以根据解释器版本拥有不同的字节码版本。
  • 只发送字节码而没有源代码是自找麻烦。不保证字节码在平台、python 实现或版本之间可移植。
  • @PM2Ring Python 3.x 字节码被移动到 'pycache' 目录目录,并附加了 python 版本 pradeep@ubuntu:~/Python/Module_Test$ ls __pycache__/ a. cpython-34.pyc a.cpython-35.pyc

标签: python python-3.x python-import


【解决方案1】:

你的理解没有错;你可以,但是这样做不是最好的主意。 Afaik import 语句的默认行为不会自行执行此操作,您需要使用 imp 中已弃用的函数、编写自己的函数或自定义导入过程来执行此操作。

对于imp,您可以这样使用load_compiled

from imp import load_compiled

mod = load_compiled('a', '__pycache__/a.cpython-35.pyc')

导入您的模块。我知道 Python 所做的值得注意的事情是,它不会重新编译模块 a.py,如果它对应的 *.pyc 存在并且仍然有效。

【讨论】:

  • 我不打算在生产级别执行此操作。我试图理解作者所说的关于使用没有源代码的字节码导入模块的内容。
  • @Pradeep_Evol 啊,我明白了,那很好:-)
猜你喜欢
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
相关资源
最近更新 更多