【发布时间】: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