L'obtention Tenté relative à l'importation de non-erreur de package en dépit de __init__.py
J'ai un forfait cclogger
. Ce répertoire a un __init__.py
fichier avec un peu de code pour charger la configuration. Lorsque j'essaie d'exécuter le fichier api_main.py
dans ce répertoire en utilisant la commande suivante...
python -m cclogger.api_main
J'ai le erro:-
config loaded
Instantiating DB with: cclogger/test123@localhost:x
Instantiated ParseCentral
Register parser called by : CitiIndia
Registered parser for email: CitiAlert.India@citicorp.com
Instantiated SmsParseCentral
Register parser called by : Citi Bank
Registered sms parser for address: lm-citibk
Register parser called by : HDFC Bank
Registered sms parser for address: am-hdfcbk
Traceback (most recent call last):
File "/Users/applegrew/Dropbox/Credit Expense/cclogger/cclogger/api_main.py", line 4, in <module>
from .bottle import run, default_app, debug, get
ValueError: Attempted relative import in non-package
Les messages affichés au-dessus de l'erreur à partir de modules dans le même paquet qui ont été importées par __init__.py
.
Le code dans api_main.py est:-
import re
import os
from .bottle import run, default_app, debug, get
from .common_util import date_str_to_datetime, UTCOffset, date_filter
#app = Bottle()
default_app().router.add_filter('date', date_filter)
from . import api, dev
@get('/index')
def index():
return "CCLogger API main live and kicking."
if dev:
debug(True)
run(reloader=True, port=9000)
else:
os.chdir(os.path.dirname(__file__))
application = default_app()
J'ai python 2.7.1.
Ce que je fais mal? Vous pouvez voir le code complet à https://github.com/applegrew/cclogger/tree/master/cclogger
OriginalL'auteur AppleGrew | 2013-09-19
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas exécuter un module python directement comme un script (je ne sais pas vraiment pourquoi).
MODIFIER : La raison est expliquée dans le PEP338 qui est la spec pour le
"-m"
option.Pour tester votre application, encapsuler api_main dans une fonction et de créer un haut-niveau main.py fichier qui est l'exécution de la boucle principale :
cclogger/api_main.py :
Et /main.py :
Vous pouvez exécuter votre application en tapant
python main.py
,python -m main
oupython -c "import cclogger.api_main; api_main.main()"
.PS : merci pour relier la source complet, il est toujours beaucoup plus utiles que les bouchons fournis avec la question.
python -m cclogger.poll_main
œuvres?Il ne fonctionne pas pour moi. (pour la même raison: Relatif à l'importation dans un non-package)
Je ne sais pas pourquoi, mais ça marche pour moi. C'est de la folie.
Cette acceptée réponse est incorrecte (ou plutôt de date - c'est probablement vrai pour Python 2.5, mais l'OP a déclaré Python 2.7). Veuillez vous référer à ma réponse.
C'est encore valable pour la 2.7. Il n'y a que la compatibilité ascendante pour les 2.xx les spécifications (ou si vous préférez 2.xx implémentations sont rétro-compatibles).
OriginalL'auteur lucasg
Relative des importations de fonctionner correctement dans les modules exécutés à l'aide de
python -m
depuis la version 2.6 de Python. Comme expliqué dans http://www.python.org/dev/peps/pep-0366, le__package__
attribut est automatiquement réglée sur le module lorsqu'il est exécuté de cette façon, de sorte que, par rapport importations de travail. La pièce qui est à l'origine de l'échec ici est le reloader, qui, apparemment, ne parvient pas à définir__package__
.Edit: en Regardant le code, je vois que c'est une bouteille de l'API. Je n'ai pas vérifier bouteille, mais il a probablement le même problème que le Flacon de reloader, qui tente de la redémarrer en faisant confiance à ce qui est dans
sys.argv
. Le problème est que le code qui gèrepython -m
(qui est dans lerunpy
module) modifiesys.argv
, en supprimant le "m" et de traduire le nom du module à un nom de fichier (ce qui est très frustrant, mais je suis sûr qu'ils ont une bonne raison). Ainsi, ce que le reloader s'exécute en fait n'a pas de "m" et les bits qui définit__package__
se déclenche jamais, résultant en l'absence de soutien relative des importations.OriginalL'auteur CryingCyclops