2016-05-19 5 views
2

私はメインスクリプトファイルを持っています。main.pyと呼びましょう。サブディレクトリ "module /"にあるモジュールファイルを持っています。これをmod.py(module/mod.py)別のフォルダからpythonでモジュールをインポートする

ディレクトリツリーはこのようなものです:

-main.py 

-module/ 
| 
|---mod.py 

今、私はmain.pyでグローバル変数を持っている、「」それはmod.pyに私が機能を持っている1. に等しいですそれを呼び出しますグローバル変数aを出力する必要があります。

main.py:

import sys 
sys.path.append("module/") 
from mod import * 

global a 
a = 1 

print_it() 

モジュール/ mod.py:

from main import * 

def print_it(): 
    global a 
    print a 

私はmain.pyスクリプトを起動すると、私が手:

NameError: name 'print_it' is not defined

なぜ?

+1

'module /'フォルダに 'main.py'ファイルがないので、 –

+2

は動作しません。 'main'では' mod'をインポートし、 'mod'では' main'をもう一度インポートします。そして問題はここにあります。 'mod'は完全にインポートされていませんでした。そして 'print_it'は作成されないまでです。 – qvpham

+0

この行を 'main.py'で' mod import * 'から' import mod'に変更するとどうなりますか? –

答えて

0

試してみてください。モジュールフォルダの完全なパスを指定してください。リモートマシンで実行している場合は、osモジュールを使用して絶対パスを取得することができます。

import sys 
from os import path as expath 
sys.path.append(os.path.abspath(r'module/')) 

希望します。ハッピーコーディング:)輸入部分について

1

: をディレクトリツリーは次のようになります。

-main.py 

-module/ 
| 
|---__init__.py 
|---mod.py 

__init__.pyファイルが空にすることができ、それが3.xの には必要ありませんそして、あなたが従うならば次のようにグローバルを使用する方法は、そのようなあなたのメソッドをインポートすることができます。

from mod import print_it 

代わりのグローバル変数を使用して、新しいモジュールの共通/グローバル(あなたはそれに名前を付けたいものは何でも)次のように作成することができます。

class Common: 
    pass 

common = Common() 
common.a = 0 

を、あなたはあなたにそれをインポートしますモジュール

from Common import common 

、あなたはすべてのモジュールでcommon.aにアクセスする必要がありますし、で、あなたの名前空間を汚染しませんグローバル変数。ここでは一例


Common.py上記のように定義されます。次のように

mod.py:

from Common import common 

def printa(): 
    print common.a 

とメイン。PY:

from Common import common 
from mod import printa 

printa() 
common.a = 10 
printa() 
+0

これは 'print_it'が定義されていないこととは関係ありません。 –

+0

@Tadhg McDonald-Jensen:これを使用してmain.aで定義し、print_itで使用することができます。これは、変数が最初に定義されているかどうかを知らずに別のモジュールに含まれています。 –

+0

ok ...しかし、定義されていないと問題が発生し、 'print_a'が定義されていないという問題は解決されません。 –

0

は、基本的に何が起こっているのかmain.pymod.pyからすべてを輸入していることです。その時点で、Pythonはmod.pyの行の後に行を実行しますが、mod.pyの最初の行はmain.pyからすべてをインポートしています。これでpythonはmain.pyから再び行を実行します。 mod.pyはすでにインポートされているので、mod.pyにインポートされたため、mod.pyはまだ完全に実行されていないため、mod.pyに戻り、print_it()に達するまで行を続けることはありません。 。

このanswerは、いくつかの良い例で同じアイデアを説明しています。

関連する問題