2014-11-19 15 views
6

Sto usando pandas 0.14.1 su un server web per elaborare report da un database SQL.Come posso importare sottomoduli di panda senza importare matplotlib?

Non ho bisogno di alcun impianto di stampa, ma matplotlib è sempre importato.

Come posso importare solo i moduli di cui ho bisogno per fare quanto segue?

df = pd.io.sql.frame_query(query, con=conn) 
df['colname'].apply(somefunc) 
df.set_index('colname') 
print df.to_html() 

sono costantemente dover aggiungere il seguente trucco per tutto il mio rapporto di generazione di script:

import os 
os.environ['MPLCONFIGDIR'] = '/tmp/' 

Prima di importare i panda. Cosa posso fare per evitarlo?

Ecco il mio webserver log degli errori quando Tralascio questo hack:

File "/var/www/scripts/myscript.py", line 46, in index\n from pandas.io import sql 
File "/usr/lib/python2.7/dist-packages/pandas/__init__.py", line 41, in <module>\n from pandas.core.api import * 
File "/usr/lib/python2.7/dist-packages/pandas/core/api.py", line 9, in <module>\n from pandas.core.groupby import Grouper 
File "/usr/lib/python2.7/dist-packages/pandas/core/groupby.py", line 15, in <module>\n from pandas.core.frame import DataFrame 
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 38, in <module>\n from pandas.core.series import Series 
File "/usr/lib/python2.7/dist-packages/pandas/core/series.py", line 2524, in <module>\n import pandas.tools.plotting as _gfx 
File "/usr/lib/python2.7/dist-packages/pandas/tools/plotting.py", line 26, in <module>\n import pandas.tseries.converter as conv 
File "/usr/lib/python2.7/dist-packages/pandas/tseries/converter.py", line 7, in <module>\n import matplotlib.units as units 
File "/usr/lib/pymodules/python2.7/matplotlib/__init__.py", line 774, in <module>\n rcParams = rc_params() 
File "/usr/lib/pymodules/python2.7/matplotlib/__init__.py", line 692, in rc_params\n fname = matplotlib_fname() 
File "/usr/lib/pymodules/python2.7/matplotlib/__init__.py", line 604, in matplotlib_fname\n fname = os.path.join(get_configdir(), 'matplotlibrc') 
File "/usr/lib/pymodules/python2.7/matplotlib/__init__.py", line 253, in wrapper\n ret = func(*args, **kwargs) 
File "/usr/lib/pymodules/python2.7/matplotlib/__init__.py", line 478, in _get_configdir\n raise RuntimeError("Failed to create %s/.matplotlib; consider setting MPLCONFIGDIR to a writable directory for matplotlib configuration data"%h) 
RuntimeError: Failed to create /var/www/.matplotlib; consider setting MPLCONFIGDIR to a writable directory for matplotlib configuration data 

Ulteriori dettagli: Platform è Ubuntu 12.04LTS che ha una versione abbastanza vecchia di matplotlib. Recent versions fix this error by creating a temp file. Comunque fa ancora schifo che matplotlib sia in esecuzione nel mio webserver quando non ne ho bisogno.

+2

hai provato a importare solo ciò di cui hai bisogno. per esempio. 'da pandas.io import sql'? (invece di 'import pandas come pd') – hitzg

+0

@hitzg si, continua a importare matplotlib tramite' import pandas.core.common come comm' che poi importa tutti i panda di importazione dei panda come pd' – Sekenre

+1

Hack idea: cosa succede se aggiungi un 'matplotlib.py' vuoto alla tua directory di script? Questo dovrebbe ombreggiare il sistema 'matplotlib'. – DSM

risposta

1

Sfortunatamente la risposta è aggiornare matplotlib a una versione che crea una directory di configurazione scrivibile all'avvio se le ubicazioni predefinite non sono disponibili. Questo è un problema se stai usando i tuoi pacchetti di distribuzione linux (matplotlib v1.1.1) Le versioni successive alla 1.3.1 dovrebbero andare bene.

Entrambi i suggerimenti nei commenti non risolvono il problema.

Cambiare la configurazione di mpl per utilizzare un driver di visualizzazione diverso come Agg non impedisce a matplotlib di provare a creare una directory di configurazione.

L'aggiunta di un file matplotlib.py vuoto interrompe i panda perché richiede il modulo matplotlib.units per la conversione dei tipi di dati.

Quindi, per evitare questo problema fino all'aggiornamento di matplotlib, il trucco os.environ['MPLCONFIGDIR'] = '/tmp/' funziona correttamente, ma dobbiamo ricordarci di inserirlo in tutti i file che utilizzano i panda sul nostro server web. (oppure crea il nostro modulo personalizzato che nasconde tutto questo)

Problemi correlati