2016-11-24 8 views
3

Из питона книги:модуль питона Импортирование с использованием байткод с из источника

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' 

Что я делаю не так? Можем ли мы импортировать модуль из байтового кода без источника? Является ли мое понимание утверждения книги неправильным?

+0

Я не использую Anaconda, но при использовании стандартного интерпретатора CPython имя файла байткода совпадает с именем исходного файла с добавлением «c», то есть «a.py», компилируется в «a.pyc». Попробуйте сделать ссылку с именем «a.pyc» на «a.cpython-35.pyc» или просто переименуйте «a.cpython-35.pyc» в «a.pyc» и посмотрите, что произойдет. –

+0

Это стандартное поведение Python из того, что я знаю @ PM2Ring, изменяя имя, чтобы вы могли иметь разные версии байт-кода в зависимости от версии интерпретатора. –

+0

Доставка только байт код без источника просит неприятностей. Байт-код не гарантированно переносится между платформами, реализациями или версиями python. – cdarke

ответ

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 и остается в силе.

+1

Я намерен сделать это на уровне производства. Я пытаюсь понять, что автор говорит об импорте модулей с байт-кодом без источника. –

+0

@Pradeep_Evol ах, я вижу, это прекрасно, тогда :-) –