Posso executar o interpretador python sem gerar os arquivos .pyc compilados?
268
Em "Novidades do Python 2.6 - Alterações de intérpretes" :
Agora, o Python pode ser impedido de gravar arquivos .pyc ou .pyo, fornecendo a opção -B ao interpretador Python ou definindo a variável de ambiente PYTHONDONTWRITEBYTECODE antes de executar o interpretador. Essa configuração está disponível para os programas Python como a
sys.dont_write_bytecode
variável e o código Python pode alterar o valor para modificar o comportamento do intérprete.
Atualização 27-11-2010: O Python 3.2 soluciona o problema de bagunçar as pastas de origem com os .pyc
arquivos, introduzindo uma __pycache__
subpasta especial , consulte Novidades do Python 3.2 - Diretórios de repositórios PYC .
export PYTHONDONTWRITEBYTECODE=1
fonte
site-packages/usercustomize.py
para aplicar isso a todos os seus scripts. Para mim, esse diretório era$HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
. Cf. docs.python.org/2/tutorial/…import sys; sys.dont_write_bytecode = True
Na verdade, existe uma maneira de fazer isso no Python 2.3+, mas é um pouco esotérico. Não sei se você percebeu isso, mas você pode fazer o seguinte:
De acordo com a biblioteca zipimport :
Portanto, tudo o que você precisa fazer é compactar os arquivos, adicionar o arquivo zip ao seu sys.path e importá-los.
Se você estiver criando isso para o UNIX, considere também empacotar seu script usando esta receita: executável zip do unix , mas observe que pode ser necessário ajustar isso se você planeja usar o stdin ou ler qualquer coisa do sys.args (pode ser feito sem muita dificuldade).
Na minha experiência, o desempenho não sofre muito por causa disso, mas você deve pensar duas vezes antes de importar módulos muito grandes dessa maneira.
fonte
Na versão 2.5, não há como suprimi-lo, exceto medidas como não dar aos usuários acesso de gravação ao diretório.
No python 2.6 e 3.0, no entanto, pode haver uma configuração no módulo sys chamada "dont_write_bytecode" que pode ser configurada para suprimir isso. Isso também pode ser definido passando a opção "-B" ou configurando a variável de ambiente "PYTHONDONTWRITEBYTECODE"
fonte
Você pode definir
sys.dont_write_bytecode = True
sua fonte, mas isso deve estar no primeiro arquivo python carregado. Se você executarpython somefile.py
, você não receberásomefile.pyc
.Quando você instala um utilitário usando
setup.py
eentry_points=
você configurousys.dont_write_bytecode
o script de inicialização. Portanto, você não pode confiar no script de inicialização "padrão" gerado pelo setuptools.Se você iniciar o Python com o arquivo python como argumento, poderá especificar
-B
:somefile.pyc
não seria gerado de qualquer maneira, mas também não há.pyc
arquivos para outros arquivos importados.Se você tiver algum utilitário
myutil
e não puder mudar isso, ele não passará -B para o interpretador python. Basta iniciar definindo a variável de ambientePYTHONDONTWRITEBYTECODE
:fonte
Eu tenho vários casos de teste em um conjunto de testes e antes de executar o conjunto de testes no Mac Terminal desta maneira:
Executando o comando dessa maneira, meu diretório estava sendo preenchido com arquivos .pyc. Tentei o método indicado abaixo e resolveu o problema:
Este método funciona se você estiver importando casos de teste para o conjunto de testes e executando o conjunto na linha de comandos.
fonte
A partir do Python 3.8, você pode usar a variável de ambiente
PYTHONPYCACHEPREFIX
para definir um diretório de cache para o Python.Nos documentos do Python:
Exemplo
Se você adicionar a seguinte linha ao seu
./profile
no Linux:O Python não criará os
__pycache__
diretórios irritantes no diretório do seu projeto, mas colocará todos eles em~/.cache/cpython/
fonte
Você pode criar os diretórios em que seus módulos existem somente leitura para o usuário em que o interpretador Python está executando.
Eu não acho que haja uma opção mais elegante. O PEP 304 parece ter sido uma tentativa de introduzir uma opção simples para isso, mas parece ter sido abandonado.
Imagino que provavelmente haja outro problema que você está tentando resolver, para o qual desativar .py [co] pareceria uma solução alternativa, mas provavelmente será melhor atacar qualquer que seja esse problema original.
fonte
Solução para
ipython 6.2.1 using python 3.5.2
(Testado no Ubuntu 16.04 e Windows 10):Ipython
não respeita%env PYTHONDONTWRITEBYTECODE =1
se definido noipython
intérprete ou durante a inicialização em~/.ipython/profile-default/startup/00-startup.ipy
. Em vez disso, use o seguinte em seu~.ipython/profile-default/startup/00-startup.py
fonte
Tanto quanto eu sei, o python irá compilar todos os módulos que você "importa". No entanto, o python NÃO compila um script python executado usando: "python script.py" (no entanto, compila todos os módulos importados pelo script).
A verdadeira questão é por que você não quer que o python compile os módulos? Você provavelmente poderia automatizar uma maneira de limpá-las se elas estiverem atrapalhando.
fonte
.pyc
arquivos antigos de bytecode . Por algum motivo, quando altero a classe / módulo, o.pyc
arquivo não é atualizado. Então, quando eu importá-lo depois de alterar o.py
arquivo, ele ainda vai usar o.pyc
arquivo, levando a erros