2017-06-10 5 views
0

J'ai un fichier appeléImpossible d'importer un autre module python même niveau

server.py 

un autre appelé constants.py

constants.py 

est sur le même niveau que server.py

Voici ce que je fais :

server.py

import constants 
def hello_world(): 
    print(BUCKET_NAME) 

constants.py

BUCKET_NAME = 'uw-note-share'

Je reçois l'erreur:

NameError: global name 'BUCKET_NAME' is not defined

Même si je suis bien d'importation. Quelle est la solution?

+1

'constantes.BUCKET_NAME' –

Répondre

2

Essayez,

from constants import BUCKET_NAME 
print(BUCKET_NAME) 

Ou vous pourriez,

import constants 
print(constants.BUCKET_NAME) 

Lorsque nous importons un module, nous faisons à notre disposition dans notre programme actuel comme un espace de noms distinct. Cela signifie que nous devrons nous référer à la fonction en notation par points, comme dans [module]. [Fonction].

3

Jetez un oeil à la documentation:

Enter the Python interpreter and import this module with the following command: import fibo This does not enter the names of the functions defined in fibo directly in the current symbol table; it only enters the module name fibo there.

Each module has its own private symbol table, which is used as the global symbol table by all functions defined in the module. Thus, the author of a module can use global variables in the module without worrying about accidental clashes with a user’s global variables. On the other hand, if you know what you are doing you can touch a module’s global variables with the same notation used to refer to its functions, modname.itemname .

Cela peut sembler très compliqué, mais ce qu'il dit est essentiellement, lorsque vous importez un module, tout son contenu reste dans une namespace séparée afin d'éviter collisions (c'est-à-dire deux variables dans deux modules avec le même nom).

Prenons votre exemple. Pour que votre code fonctionne, vous avez deux options.

Option A

dire python Explicitement que la variable que vous recherchez est défini dans le module constants.

import constants 
def hello_world(): 
    print(constants.BUCKET_NAME) 

Option B

Encore une fois, de la documentation:

There is a variant of the import statement that imports names from a module directly into the importing module’s symbol table.

Cette variante est la suivante:

from module import x 

Ce que cela fait est-il importe tout un par un du constants module.A partir de là, python traite ces données comme si elles étaient définies dans votre module actuel.

En utilisant cette approche, vous pouvez effectuer les opérations suivantes:

from constants import * 
def hello_world(): 
    print(BUCKET_NAME) 

Le * ici dit python importer tout de ce module. Ceci est pratique dans beaucoup de cas, mais soyez avisé, cela peut causer des problèmes de performance lorsque vous manipulez de gros modules. De plus, gardez à l'esprit:

This does not introduce the module name from which the imports are taken in the local symbol table

Ce que cela signifie est que si vous optez pour importer uniquement BUCKET_NAME à partir des constantes (from constants import BUCKET_NAME au lieu de import *), constants ne seront pas définis. Vous ne serez pas en mesure d'accéder à d'autres variables définies dans ce module sans également en écrivant import constants.

Pour une explication plus détaillée concernant les performances de cette dernière approche, jetez un oeil à this excellent post par Roberto Liffredo, ainsi que this par le maître python résident Martijn Pieters.

0

Vous essayez d'importer le fichier entier lui-même. Vous pouvez obtenir de travailler de deux manières,

import constants 
def hello_world(): 
    print(constants.BUCKET_NAME) 

OU

from constants import BUCKET_NAME 
def hello_world(): 
    print(BUCKET_NAME) 

J'espère que cela vous aide.