2016-05-19 5 views
2

У меня есть основной файл сценария, назовем его main.py, и у меня есть файл модуля, который находится в поддиректории «module /», назовем его mod.py (module/mod.py)Импорт модулей в python из разных папок

директориии дерево, как это:

-main.py 

-module/ 
| 
|---mod.py 

Теперь у меня есть глобальную переменную в main.py, назовем его «а» и он равен 1. у меня есть функция в mod.py которой должен печатать глобальную переменную 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' нет файла' main.py' –

+2

Это не сработает. в 'main' вы импортируете' mod', в 'mod' вы снова импортируете' main'. И проблема здесь. 'mod' не был полностью импортирован. И 'print_it' пока не создан. – qvpham

+0

Что происходит, когда вы меняете эту строку в 'main.py':' from mod import * 'to' import mod'? –

ответ

0

Попытка Предоставить полный путь к папке модуля. Если вы используете его на удаленном компьютере, вы можете использовать osМодуль, чтобы получить абсолютный путь.

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

Надеюсь, это поможет. Счастливый Coding :)

1

Для импорта части: директориии дерево должно выглядеть следующим образом:

-main.py 

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

Файл __init__.py может быть пустым и не надо в 3.x И если вы будете следовать метод для использования глобального, как показано ниже, вы можете импортировать свой метод.

from mod import print_it 

Вместо того, чтобы использовать глобальную переменную, вы можете создать новый модуль Common/Global (все, что вы хотите назвать его) следующим образом:

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 

и основной.ру:

from Common import common 
from mod import printa 

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

Это не имеет никакого отношения к 'print_it', который не определен ... –

+0

@Tadhg McDonald-Jensen: с этим вы можете определить его с помощью common.a в своем главном, а затем использовать его в print_it, который содержится в другом модуле, не зная, определена ли переменная в определенной или нет. –

+0

ok ... но если он не определен, тогда возникают проблемы, и он по-прежнему не решает проблему 'print_a', которая не определена. –

0

В основном то, что происходит, что main.py импортирует все из mod.py. В этот момент python выполнит строку после строки от mod.py, но первая строка mod.py импортирует все от main.py. Итак, теперь python снова выполнит строку для строки от main.py. Поскольку mod.py уже был импортирован, python не вернется к mod.py и продолжит линию для строки, пока не достигнет print_it(), которая в этот момент еще не определена, поскольку mod.py еще не выполнен полностью из-за оператора импорта в mod.py ,

Этот answer объясняет ту же идею с некоторыми хорошими примерами.

Смежные вопросы