it-swarm.com.ru

Как избежать файлов .pyc?

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

252
Avner

From «Что нового в Python 2.6 - Изменения переводчика» :

Python теперь можно запретить запись файлов .pyc или .pyo с помощью поставляя ключ -B на Python переводчик, или установив PYTHONDONTWRITEBYTECODE environment переменная перед запуском переводчик. Эта настройка доступна к программам Python как sys.dont_write_bytecode variable и Код Python может изменить значение на изменить поведение переводчика.

Обновление 2010-11-27: Python 3.2 решает проблему загромождения папок с исходными файлами .pyc путем введения специальной подпапки __pycache__, см. Что нового в Python 3.2 - Каталоги репозитория PYC .

280
Constantin
import sys

sys.dont_write_bytecode = True
100
te wilson

На самом деле IS есть способ сделать это в Python 2.3+, но это немного эзотерично. Я не знаю, понимаете ли вы это, но вы можете сделать следующее:

$ unzip -l /tmp/example.Zip
 Archive:  /tmp/example.Zip
   Length     Date   Time    Name
 --------    ----   ----    ----
     8467  11-26-02 22:30   jwzthreading.py
 --------                   -------
     8467                   1 file
$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32) 
>>> import sys
>>> sys.path.insert(0, '/tmp/example.Zip')  # Add .Zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.Zip/jwzthreading.py'

По данным zipimport библиотеки:

В Zip-архиве могут присутствовать любые файлы, но для импорта доступны только файлы .py и .py [co]. Zip-импорт динамических модулей (.pyd, .so) запрещен. Обратите внимание, что если архив содержит только файлы .py, Python не будет пытаться изменить архив, добавляя соответствующий файл .pyc или .pyo, а это означает, что если архив Zip не содержит файлов .pyc, импорт может быть довольно медленным.

Таким образом, все, что вам нужно сделать, это заархивировать файлы, добавить zip-файл в ваш sys.path и затем импортировать их.

Если вы создаете это для UNIX, вы можете также рассмотреть возможность упаковки вашего скрипта с помощью этого рецепта: unix Zip исполняемый файл , но учтите, что вам, возможно, придется настроить это, если вы планируете использовать stdin или читать что-то из sys.args (это можно сделать без особых проблем).

По моему опыту, производительность не сильно страдает из-за этого, но вы должны дважды подумать, прежде чем импортировать любые очень большие модули таким образом.

22
Jason Baker

В 2.5 нет никакого способа подавить его, кроме таких мер, как отсутствие предоставления пользователям доступа для записи в каталог.

Однако в python 2.6 и 3.0 в модуле sys может быть параметр dont_write_bytecode, который можно установить для подавления этого. Это также можно установить, передав параметр «-B» или установив переменную среды «PYTHONDONTWRITEBYTECODE».

11
Brian

Вы можете установить sys.dont_write_bytecode = True в своем источнике, но это должно быть в первом загруженном файле python. Если вы выполните python somefile.py, вы не получите somefile.pyc.

Когда вы устанавливаете утилиту, используя setup.py и entry_points=, у вас будет установлен sys.dont_write_bytecode в скрипте запуска. Таким образом, вы не можете полагаться на сценарий запуска по умолчанию, сгенерированный setuptools.

Если вы запускаете Python с файлом python в качестве аргумента самостоятельно, вы можете указать -B:

python -B somefile.py

В любом случае somefile.pyc не будет сгенерирован, но файлы .pyc для других файлов также не будут импортированы.

Если у вас есть какая-то утилита myutil и вы не можете ее изменить, она не передаст -B интерпретатору python. Просто запустите его, установив переменную окружения PYTHONDONTWRITEBYTECODE:

PYTHONDONTWRITEBYTECODE=x myutil
6
Elwyne

У меня есть несколько тестов в тестовом наборе, и до того, как я запустил тестовый набор в Mac Terminal, вот так: 

python LoginSuite.py

При выполнении команды таким образом мой каталог заполнялся файлами .pyc. Я попробовал описанный ниже метод, и он решил проблему:

python -B LoginSuite.py

Этот метод работает, если вы импортируете тестовые наборы в набор тестов и запускаете набор в командной строке. 

3
Ravil Asadov

Вы можете создать каталоги, в которых ваши модули существуют, только для чтения для пользователя, от имени которого работает интерпретатор Python.

Я не думаю, что есть более элегантный вариант. PEP 304 , похоже, была попытка ввести простую опцию для этого, но, похоже, она была заброшена.

Я полагаю, что, вероятно, есть еще одна проблема, которую вы пытаетесь решить, для которой отключение .py [co] может показаться обходным решением, но, вероятно, будет лучше атаковать любую исходную проблему.

1
Logan

Решение для ipython 6.2.1 using python 3.5.2 (протестировано на Ubuntu 16.04 и Windows 10):

Ipython не уважает %env PYTHONDONTWRITEBYTECODE =1, если он задан в интерпретаторе ipython или во время запуска в ~/.ipython/profile-default/startup/00-startup.ipy. Вместо этого используйте следующее в ~.ipython/profile-default/startup/00-startup.py

import sys
Sys.dont_write_bytecode=True
0
alpha_989

Насколько я знаю, Python скомпилирует все модули, которые вы "импортируете". Однако python НЕ будет компилировать скрипт python, запущенный с использованием: "python script.py" (однако он скомпилирует все модули, которые импортирует скрипт).

Реальный вопрос в том, почему вы не хотите, чтобы python компилировал модули? Вы могли бы, вероятно, автоматизировать способ очистки, если они мешают.

0
Alex