Могут ли скомпилированные файлы байт-кода (.pyc) генерироваться в разных каталогах?

Возможный дубликат:
Способ скомпилировать файлы python в отдельной папке?

Когда python компилирует модули в байт-код, он создает .pyc файлы из ваших .py файлов.

Мой вопрос: возможно ли, чтобы эти .pyc файлы записывались в другой каталог, кроме того, где находится этот модуль?

Например, у меня есть большой каталог модулей. Вместо того, чтобы засорять файлы .pyc, я хотел бы сохранить исходный код в каталоге и иметь подкаталог типа "байт-код", где хранятся все .pyc.

Возможно ли это?

Ответы

Ответ 1

На это отвечает Способ скомпилировать файлы python в отдельной папке?

Короткий ответ: Нет - если вы не используете Python 3.2 или новее - см. здесь.

Чтобы уточнить: до 3.2 вы можете скомпилировать байт-код и поместить его в другое место в соответствии с предложением Брайана Р. Бонди, но если вы его не запустили (а не из папки, которую хотите сохранить в чистом виде), Python по-прежнему будет выводить байт-код где находятся файлы .py.

Ответ 2

Проверьте модуль py_compile и, в частности:

py_compile.compile(file[, cfile[, dfile[, doraise]]])

Cfile - это параметр, который вас интересует.

Из приведенной выше ссылки:

... Байт-код записывается в cfile, который по умолчанию имеет файл + 'c'...

Ответ 3

Я искал ответ на это сам и не мог найти слишком много. Однако вы можете просто префикс имени папки для вновь скомпилированного имени файла (сначала убедитесь, что папка существует)

Вот код, который работает для меня:

import py_compile
import os
import glob
import shutil

path = ''
for infile in glob.glob( os.path.join(path, '*.py') ):
    print "current file is: " + infile
    strDestination = 'compiled/' + infile + 'c'
    py_compile.compile(infile,strDestination)

Ответ 4

В случае, если "мусор" действительно является вашей проблемой, вы всегда можете упаковать файлы .py, .pyc и/или .pyo в .zip файл и добавить его в свой sys.path.

Ответ 5

Кажется, я кое-что запомнил, что это невозможно, и что у Python People есть причины не сделать это возможным, хотя я не могу вспомнить, где.

EDIT: извините, я неправильно понял вопрос: я имел в виду, что это невозможно (я думаю), чтобы настроить исполняемый файл Python, чтобы поместить его файлы байт-кода в другой каталог по умолчанию. Вы всегда можете написать небольшой компилятор Python script (или найти его, я уверен, что они там), который поместит файлы байт-кода в выбранное вами местоположение.

Ответ 6

Вы можете написать script, чтобы скомпилировать их, а затем переместить их. Что-то вроде:

for i in `ls *.pyc`
do
 mv $i $DEST_DIR
done

(который может быть сокращен до:

for i in *.pyc
do
    mv $i $DEST_DIR
done

или, что удивительно,

mv *.pyc $DEST_DIR

)