9 ответов:
С "что нового в Python 2.6-интерпретатор изменения":
Python теперь можно предотвратить пишу.пик или .гнойно файлы поставляя - B переключиться на Python интерпретатор, или путем установки PYTHONDONTWRITEBYTECODE окружающая среда переменные перед запуском переводчик. Этот параметр доступен программы, написанные на Python
sys.dont_write_bytecodeпеременной, и Код Python может изменить значение на Измените поведение интерпретатора.обновление 2010-11-27: Python 3.2 решает проблему загромождения исходных папок с помощью
.pycфайлы, введя специальный__pycache__папке, видят что нового в Python 3.2 - PYC каталоги репозитория.
на самом деле есть способ сделать это в 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, еще .так) запрещена. Обратите внимание, что если архив содержит только файлы .py, Python не будет пытаться изменить архив путем добавления соответствующего .пик или .файл pyo, что означает, что если ZIP-архив не содержит .файлы pyc, импорт может быть довольно медленным.
таким образом, все, что вам нужно сделать, это zip файлы вверх, добавить zipfile к вашей системе.путь, а затем импортировать их.
Если вы создаете это для UNIX, вы также можете рассмотреть возможность упаковки вашего скрипта с помощью этого рецепта: Unix zip исполняемый файл, но учтите, что вам придется изменить, если вы планируете использовать stdin или чтение чего-либо из sys.аргументы (это можно сделать без особых проблем).
по моему опыту производительность не слишком страдает из-за этого, но вы должны подумать дважды, прежде чем импортировать любые очень большие модули таким образом.
в 2.5 нет никакого способа подавить его, кроме таких мер, как не предоставление пользователям доступа к записи в каталог.
в python 2.6 и 3.0, однако, может быть параметр в модуле sys под названием "dont_write_bytecode", который может быть установлен для подавления этого. Это также можно установить, передав параметр"- B "или установив переменную среды "PYTHONDONTWRITEBYTECODE"
вы можете установить
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
у меня есть несколько тестовых случаев в тестовом наборе, и прежде чем я запускал тестовый набор в терминале Mac следующим образом:
python LoginSuite.pyзапуск команды таким образом, мой каталог был заполнен .файлы pyc. Я попробовал ниже указанный метод, и это решило проблему:
python -B LoginSuite.pyэтот метод работает, если вы импортируете тестовые случаи в набор тестов и запускаете набор в командной строке.
насколько я знаю, python скомпилирует все модули, которые вы "импортируете". Однако python не будет компилировать скрипт python, выполняемый с помощью: "python script.py (однако он будет компилировать любые модули, которые импортирует скрипт).
реальные вопросы - почему вы не хотите, чтобы python компилировал модули? Вы, вероятно, могли бы автоматизировать способ очистки их, если они мешают.
вы можете создать каталоги, в которых ваши модули существуют только для чтения для пользователя, от имени которого работает интерпретатор Python.
Я не думаю, что есть более элегантный вариант. PEP 304 кажется, была попытка ввести простой вариант для этого, но, похоже, была заброшена.
Я предполагаю, что, вероятно, есть какая-то другая проблема, которую вы пытаетесь решить, для которой отключение .py[co] будет обходным путем, но это, вероятно, будет лучше атаковать то, что эта оригинальная проблема вместо этого.
решение
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.pyimport sys Sys.dont_write_bytecode=True
Comments