Можно ли запустить интерпретатор python без генерации скомпилированных файлов .pyc?
Как избежать .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/