2014-10-16 11 views
8

Sto tentando di aggiungere la funzionalità di Google Cloud Storage a un'applicazione GAE Python che è già in esecuzione con funzionalità significative. Lavoro interamente con PyCharm sul mio computer di sviluppo, che è un Mac con OS X 10.9.5.Esecuzione di GAE GCS su PyCharm in OS X, errore di runtime "Nessun modulo denominato cloudstorage"

ho creato un nuovo modulo Python che contiene questa dichiarazione:

import cloudstorage as gcs 

come mostrato nel codice di esempio in https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/getstarted

Quando ho aggiunto quella linea, PyCharm ha detto "No module named cloud storage" nell'editor.

Ho quindi seguito entrambe le istruzioni "pip" e "svn" allo https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download per scaricare la libreria client GCS.

Nel tentativo di seguire queste istruzioni, tenendo conto la mia esperienza precedente con questo ambiente di programmazione, in realtà ho provato ad utilizzare "pip" tre volte:

  • volta senza l'opzione "-t", dal momento che' ho mai necessario che l'opzione con il "pip" prima
  • Una volta che si utilizza l'opzione "-t" per specificare la mia directory dell'applicazione sottodirectory "lib"
  • volta utilizzando: pip install GoogleAppEngineCloudStorageClient -t /Applications/GoogleAppEngineLauncher.app//Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib, dal momento che non ero sicuro di quello che le istruzioni intende con "<your_app_directory/lib> "

Come detto, ho anche eseguito il comando" svn ". Quindi, come menzionato in install python google cloud storage client on Ubuntu 14.04, ho eseguito "cd gcs-client/src" e "sudo python setup.py install". Ho eseguito questi comandi nella mia directory principale dell'utente.

Dopo ognuna di quelle installazioni riuscite ma diverse della libreria client GCS, ho esaminato la finestra dell'editor PyCharm per il mio modulo e ha sempre avuto lo stesso errore "Nessun modulo denominato cloudstorage". Ma come esperimento, vorrei anche provare a riavviare PyCharm, e provare anche a eseguire la mia app.

A un certo punto, la finestra dell'editor ha smesso di mostrare l'errore. Non è stato immediatamente dopo uno di quei passaggi sopra, ma dopo vorrei andare via a leggere varie pagine web e poi tornare a guardare di nuovo l'errore. Non so quale sia stata l'installazione che ha eliminato il messaggio di errore nell'editor PyCharm.

In ogni caso, ogni volta che provo a eseguire l'app (di nuovo all'interno di PyCharm), ottengo sempre l'errore di runtime "ImportError: nessun modulo denominato cloudstorage" nella stessa istruzione di importazione.

La pagina Esegui/Debug di configurazione per questa app ha sia "Aggiungi root di contenuto a PYTHONPATH" sia "Aggiungi root di origine a PYTHONPATH" selezionata.

Ovviamente l'aiuto principale che voglio è come superare l'errore di runtime "Nessun modulo denominato cloudstorage", anche se l'istruzione import non mostra più un errore.

Penso di avere anche fino a tre versioni spurie della libreria client GCS. Sono molto più interessato a superare "Modulo non trovato", dal momento che è uno spettacolo-stopper, ma se hai qualche idea su come posso eliminare le versioni spurie in modo che non siano solo in giro, sarei più grato anche per quell'aiuto.

+0

Controllare la cartella del progetto. Assicurati che la cartella GCS sia denominata 'cloudstorage' se è denominata altrimenti non la vedrà. – Ryan

+0

@Bruyere La struttura è '/lib/cloudstorage'. Presente anche '/lib/GoogleAppEngineCloudStorageClient-1.9.5.0-py2.7.egg-info'. Non capisco le directory delle informazioni sull'uovo. A proposito, se aiuta, ho anche '/lib/crc16pure.py' e può essere importato e funziona quando viene eseguito. Si noti, tuttavia, che 'cloudstorage' è una directory, mentre' crc16pure.py' è un modulo Python. La directory 'cloudstorage' non contiene' cloudstorage.py', ma contiene 'cloudstorage_api.py' tra gli altri file. – Lindsay

+0

da google.appengine.ext import cloudstorage – DMTishler

risposta

11

Se la directory "cloud storage" è al <app>/lib/cloudstorage, allora l'istruzione import deve specificare "lib":

import lib.cloudstorage 

Nel mio caso, è:

import lib.cloudstorage as gcs 

Tra l'altro, il La directory <app>/lib/GoogleAppEngineCloudStorageClient-1.9.5.0-py2.7.egg-info non sembra essere necessaria e può essere eliminata.

+0

Né importare lib.cloudstorage né importare cloudstorage funziona su un'app di GAE dal vivo per me. Intuizione? – Jonny

+2

Ciao, @Jonny. È necessario ottenere la libreria Cloudstorage e aggiungerla alla directory del progetto in modo che venga caricata con il resto dell'app quando si distribuisce.Ho creato una directory "lib" e ho messo la mia copia lì. La mia directory "lib" ha anche un file '__init.py__' con l'istruzione' import cloudstorage'. Credo che l'installazione che ho ottenuto per Cloudstorage contenesse file non necessari. L'unico che ho tenuto nella mia "lib" è la directory "cloudstorage". – Lindsay

+1

Ok, così facendo questo lavoro anche online? – Jonny

10

In realtà, è anche necessario

touch __init__.py

nella directory lib. Questo renderà il modulo cloudstorage visibile al comando "import lib.cloudstorage".

Gentile Google: le distribuzioni devono includere questo file (o la procedura deve tenerne conto) e lo script demo deve essere modificato per riflettere l'utilizzo previsto. Ma ancora più importante perché stai distribuendo/PROLIFERANDO il codice della libreria in questo modo ?? !!! Perché questo non è distribuito tramite gcloud? Come faccio a prendere una patch per questa libreria?

+3

Questa risposta ha effettivamente risolto il problema per me. Mi piacerebbe sapere il motivo del downvote che hai ottenuto. –

+0

Stessa. La documentazione di GCS-on-GAE suggerisce l'installazione in una directory 'lib', tuttavia non funziona a meno che non si tocchi anche' lib/__ init __. Py'. Questo era esattamente il mio problema. –

1

risolvo il problema modulo mancante aggiungendo quanto segue al mio file principale (main.py):

import os 
import sys 
sys.path.append(os.path.join(os.path.dirname(__file__), "lib")) 

Credo che questo sia il modo Guido previsto. Ora il mio codice dice semplicemente import cloudstorage as gcs. Nessuna delle attività lib.cloudstorage o lib/__init__.py.

Da https://stackoverflow.com/a/37645984/1740008

3

soluzione del risposta accettata

import lib.module_name 

sicuramente in grado di risolvere il problema. Ma non mi piace aggiungere lib di fronte a ogni singolo modulo e capita di vedere come Google suggerisce di importare librerie di terze parti come questa.

appengine eseguirà automaticamente un file denominato appengine_config.py. Quindi puoi creare tale file e inserire

from google.appengine.ext import vendor 
vendor.add('lib') 

all'interno di quel file. Questo ti aiuterà a dire appengine per trovare le dipendenze in quella cartella, quindi puoi semplicemente scrivere

import cloudstorage as gcs 
Problemi correlati