Відповіді:
З розділу "Що нового в 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 Repository Directories .
export PYTHONDONTWRITEBYTECODE=1
import sys
sys.dont_write_bytecode = True
site-packages/usercustomize.py
щоб це стосувалося всіх ваших сценаріїв. Для мене цей каталог був $HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
. Ср. docs.python.org/2/tutorial/…
import sys; sys.dont_write_bytecode = True
Насправді є спосіб зробити це в 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, імпорт може бути досить повільним.
Таким чином, все, що вам потрібно зробити, - це скопіювати файли, додати zipfile до свого sys.path та потім імпортувати їх.
Якщо ви будуєте це для UNIX, ви можете також розглянути можливість упаковки сценарію за допомогою цього рецепта: виконувану програму unix zip , але зауважте, що вам, можливо, доведеться підправити це, якщо ви плануєте використовувати stdin чи читати що-небудь з sys.args (це МОЖЕ бути зроблено без зайвих клопотів).
На мій досвід, продуктивність не надто страждає через це, але ви повинні подумати двічі, перш ніж імпортувати будь-які дуже великі модулі таким чином.
У версії 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
в сценарії запуску. Таким чином, ви не можете покластися на сценарій запуску "за замовчуванням", створений налаштуваннями.
Якщо ви запускаєте 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 3.8, ви можете використовувати змінну середовища PYTHONPYCACHEPREFIX
для визначення каталогу кешу для Python.
З документів Python:
Якщо це встановлено, Python записуватиме файли .pyc у дерево дзеркальних каталогів на цьому шляху, а не в каталоги pycache у вихідному дереві. Це еквівалентно визначенню параметра -X pycache_prefix = PATH.
Приклад
Якщо ви додасте наступний рядок до свого ./profile
в Linux:
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Python не створить дратівливих __pycache__
каталогів у вашому каталозі проектів, натомість він поставить їх усі~/.cache/cpython/
Ви можете зробити каталоги, що ваші модулі існують лише для читання для користувача, яким працює інтерпретатор 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.py
import sys
sys.dont_write_bytecode=True
Наскільки я знаю, python буде збирати всі модулі, які ви "імпортуєте". Однак python НЕ буде компілювати запуск сценарію python, використовуючи: "python script.py" (однак він буде компілювати будь-які модулі, які імпортує скрипт).
Справжні питання, чому ви не хочете, щоб python збирав модулі? Можливо, ви могли б автоматизувати спосіб їх очищення, якщо вони заважають.
.pyc
файли байт-кодів . З якоїсь причини, коли я змінюю клас / модуль, .pyc
файл не оновлюється. Тож коли я імпортую його після зміни .py
файлу, він все одно буде використовувати .pyc
файл, що призводить до помилок