Из питона книги:модуль питона Импортирование с использованием байткод с из источника
Learning 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» и посмотрите, что произойдет. –
Это стандартное поведение Python из того, что я знаю @ PM2Ring, изменяя имя, чтобы вы могли иметь разные версии байт-кода в зависимости от версии интерпретатора. –
Доставка только байт код без источника просит неприятностей. Байт-код не гарантированно переносится между платформами, реализациями или версиями python. – cdarke