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

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

256 голосов
/ 30 сентября 2008

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

Ответы [ 9 ]

281 голосов
/ 30 сентября 2008

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

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

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

100 голосов
/ 05 марта 2012
import sys

sys.dont_write_bytecode = True
22 голосов
/ 30 сентября 2008

На самом деле есть способ сделать это в 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]. Импорт динамических модулей (.pyd, .so) в ZIP запрещен. Обратите внимание, что если архив содержит только файлы .py, Python не будет пытаться изменить архив, добавляя соответствующий файл .pyc или .pyo, что означает, что если архив ZIP не содержит файлов .pyc, импорт может быть довольно медленным.

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

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

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

11 голосов
/ 30 сентября 2008

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

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

6 голосов
/ 15 июня 2017

Вы можете установить 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
3 голосов
/ 07 октября 2016

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

python LoginSuite.py

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

python -B LoginSuite.py

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

1 голос
/ 30 сентября 2008

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

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

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

0 голосов
/ 11 февраля 2018

Решение для 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 голосов
/ 30 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...