使用输出源的字节码导入python模块

时间:2016-11-24 07:13:48

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

来自python书:

  

学习Python。第5版,第727页

我读了以下内容:

  

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

但是当在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'

我做错了什么?我们可以从没有源的字节代码导入模块吗?我对这本书的陈述的理解是错误的吗?

1 个答案:

答案 0 :(得分:1)

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

使用imp,您可以使用load_compiled

from imp import load_compiled

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

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