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

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

Ответ 1

От "Что нового в 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.

Ответ 2

import sys

sys.dont_write_bytecode = True

Ответ 3

На самом деле это способ сделать это в 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, вы можете также рассмотреть возможность упаковки вашего script с помощью этого рецепта: unix zip executable, но обратите внимание что вам может потребоваться настроить его, если вы планируете использовать stdin или читать что-либо из sys.args(это можно сделать без особых проблем).

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

Ответ 4

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

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

Ответ 5

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

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

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

python -B somefile.py

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

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

PYTHONDONTWRITEBYTECODE=x myutil

Ответ 6

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

python LoginSuite.py

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

python -B LoginSuite.py

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

Решение для 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

Ответ 10

Начиная с Python 3.8 вы можете использовать переменную среды PYTHONPYCACHEPREFIX для определения каталога кэша для Python.

Из документов Python:

Если это установлено, Python будет записывать файлы .pyc в зеркальное дерево каталогов по этому пути, а не в каталоги pycache внутри дерева исходных текстов. Это эквивалентно указанию опции -X pycache_prefix = PATH.

Пример

Если вы добавите следующую строку в ./profile в Linux:

export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"

Python не будет создавать раздражающие каталоги __pycache__ в каталоге вашего проекта, вместо этого он поместит их все в ~/.cache/cpython/