Domanda

C'è un modo per rendere Python ignorare qualsiasi file .pyc che sono presenti e sempre interpretare tutto il codice (inclusi i moduli importati) direttamente? Google non ha alzato alcuna risposta, quindi non sospetto, ma sembrava pena chiedere per ogni evenienza.

(Perché voglio fare questo? Ho una grande pipeline di script Python che sono gestiti più volte nel corso di un cluster di un paio di centinaia di computer. Script Python stessi vivono su un file system NFS condiviso. In qualche modo, di rado, dopo aver gestito centinaia di volte per diverse ore, che improvvisamente iniziano a schiantarsi con un errore di non essere in grado di importare un modulo. Forzare la rigenerazione delle correzioni di file .pyc il problema. io voglio, naturalmente, per risolvere le cause di fondo, ma nel frattempo abbiamo anche bisogno il sistema per continuare l'esecuzione, così sembra come ignorare i file .pyc, se possibile, sarebbe una soluzione ragionevole).

P.S. Sto usando Python 2.5, quindi non posso usare -B.

È stato utile?

Soluzione

potrebbero usare il modulo imp della libreria standard di Python reimplementare __builtins__.__import__, che è la funzione di hook chiamato da import e la dichiarazione from. In particolare, la funzione imp.load_module può essere usato per caricare un .py anche quando la .pyc corrispondente è presente. Essere sicuri di studiare attentamente tutti i documenti nella pagina che ho indicai, oltre a quelli per Importa , come è una specie di un lavoro delicato. La documentazione stessi suggeriscono usando ganci di importazione invece (per PEP 302), ma per questo compito particolare ho il sospetto che sarebbe ancora più difficile.

A proposito, le probabili cause per i vostri problemi osservati includono condizioni di gara tra diversi computer che tentano di file .pyc di scrittura allo stesso tempo - di blocco NFS è notoriamente traballante ed è sempre stato ;-). Finché ogni compilatore Python che si sta utilizzando è la stessa versione (se non, siete in grossi guai in ogni caso ;-), preferirei precompilare tutti i file .py in .pyc e fare le loro directory di sola lettura; Quest'ultimo sembra l'approccio più semplice in ogni caso (piuttosto che l'hacking __import__), anche se per qualche motivo non è possibile precompilare.

Altri suggerimenti

Non è esattamente quello che hai chiesto, ma sarebbe la rimozione dei file .pyc esistenti e quindi non creare più lavoro per voi? In tal caso, è possibile utilizzare l'opzione -B:

>python --help
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x

Nel caso qualcuno sta usando Python 2.6 o superiore con la stessa domanda, la cosa più semplice da fare è:

  1. Elimina tutti i file .pyc
  2. Esegui tutti i tuoi interpreti Python con l'opzione -B, in modo da non generare file .pyc.

Dalla documentazione:

  

-B   Se dato, Python non tenterà di scrivere .pyc o .pyo file per l'importazione di moduli di origine. Vedi anche PYTHONDONTWRITEBYTECODE.

     

Nuovo nella versione 2.6.

Se non è possibile eliminare tutte le .pycs, allora si potrebbe:

1) Eseguire tutti gli interpreti il ??tuo pitone con le opzioni -B -O.

Questo dirà pitone di cercare .pyo file per bytecode invece di file .pyc (-O) e dire python non generare alcun file bytecode (-B).

La combinazione delle due opzioni, supponendo che non li hanno usato prima, è che Python non genererà alcun file bytecode e non cercherà i file bytecode che sarebbero stati generati da piste più anziani.

Dalla documentazione:

  

-B   Se dato, Python non tenterà di scrivere .pyc o .pyo file per l'importazione di moduli di origine. Vedi anche PYTHONDONTWRITEBYTECODE.

     

Nuovo nella versione 2.6.

     

-O   Attivare le ottimizzazioni di base. Questo cambia l'estensione del file per file compilati (bytecode) da .pyc a .pyo. Vedi anche PYTHONOPTIMIZE.

Forse si potrebbe ovviare a questo, ad esempio, la pianificazione di un lavoro di chiudere periodicamente verso il basso gli script ed eliminare i file .pyc.

Bene, non penso mai Python interpreta codice direttamente se si sta caricando il codice da un file. Anche quando si utilizza la shell interattiva, Python compilare il modulo importato in un .pyc.

Detto questo, si potrebbe scrivere uno script di shell di andare avanti e cancellare tutti i file .pyc prima di lanciare i propri script. Quello certamente forzare una completa ricostruzione prima di ogni esecuzione.

Si possono trovare PEP 3147 - PYC Repository Directory per essere di grande interesse da Python 3.2 in poi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top