2017-06-10 17 views
0

私はと呼ばれるファイルを持っている他のPythonモジュールと同じレベルをインポートすることができません

server.py 

server.pyここ

と同じレベルにあるconstants.py

constants.py 

私がやっている何と呼ばれます:

server.py

import constants 
def hello_world(): 
    print(BUCKET_NAME) 

私はエラーを取得しています

BUCKET_NAME = 'uw-note-share'

constants.py:私は正常にインポートしていたとしても

NameError: global name 'BUCKET_NAME' is not defined

。どうした?我々はモジュールをインポートすると

+1

「定数.BUCKET_NAME」 –

答えて

2

てみてください、

from constants import BUCKET_NAME 
print(BUCKET_NAME) 

それとも、可能性、

import constants 
print(constants.BUCKET_NAME) 

、我々は別の名前空間として、当社の現在のプログラムで私たちが利用できるようにしています。つまり、[module]。[function]のようにドット表記の関数を参照する必要があります。

3

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 .

これは非常に複雑に見えるかもしれませんが、あなたは、モジュールをインポートするとき、それは、基本的に言う、その内容のすべてがないようにするために、別々のnamespaceに残りを衝突(すなわち、同じ名前を持つ2つのモジュールの2つの変数)。

あなたの例を挙げる。コードを動作させるには、2つのオプションがあります。

オプション

は、明示的にあなたが探している変数がconstantsモジュールで定義されているのpythonを教えてください。

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

documentationから再びオプションB

、:

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

この亜種は以下の通りです:

それはですべて1をインポートしこれが何をしている
from module import x 

からのもの3210モジュール。その後、Pythonはそのデータをあなたの現在のモジュールで定義されているかのように扱います。このアプローチを使用

、次の操作を実行できます。

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

ここ*は、そのモジュールからすべてをインポートするのpythonを伝えます。これは多くの場合に便利ですが、大きなモジュールを扱う際にパフォーマンスの問題を引き起こす可能性があることを忠告してください。また、心に留めておく:

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

を、これはあなたが唯一の定数からBUCKET_NAMEfrom constants import BUCKET_NAME代わりのimport *)をインポートすることを選ぶ場合、constantsが定義されないことである意味は何。そのモジュールで定義されている他の変数にアクセスすることはできません。import constantsも書かなければなりません。後者のアプローチのパフォーマンスに関するより詳細な説明については

、常駐のpythonマスターMartijn PietersによってRoberto Liffredoだけでなく、thisによってthis優秀なポストを見てみましょう。

0

ファイル全体をインポートしようとしています。あなたは、私はこれがあなたの役に立てば幸い

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

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

OR

、それは二つの方法で仕事を得ることができます。

関連する問題