2017-02-11 13 views
-1

у меня есть:импорт класса из другой директории

script1.py in database/table_inserts/ #trying to import below file into 
dbcrud.py in database/     #trying to import by above file 

в script1.py у меня есть:

from ..dbcrud import set_db_setting 

но это бросает ошибку:

from ..dbcrud import set_db_setting 
SystemError: Parent module '' not loaded, cannot perform relative import 

Что я делаю неправильно?

+1

У вас есть '__init __ py' в каталоге базы данных.? Если это так, я думаю, что вы можете сделать «из базы данных import dbcrud». – 2ps

+0

Нет, у меня его нет, что он должен содержать? – Jshee

+0

Я сделал пустую __init__.py в базе данных /, но это ничего не меняет – Jshee

ответ

1

Edit:

Благодаря @Mad Physicist комментарии.

Самый простой и тривиальный способ решить вопрос, чтобы добавить пустой __init__.py файл в папке database/ и другой пустой __init__.py файл в папку database/table_inserts/ для того, чтобы быть признанным в качестве пакета.

Смотрите этот пример иерархии:

database/ 
├── dbcrud.py 
├── __init__.py 
└── table_inserts 
    ├── __init__.py 
    └── script1.py 

1 directory, 4 files 

Тогда все, что вам нужно сделать в script1.py, чтобы импортировать модуль из dbcrud.py как в этом примере:

# Note here the double dots '..' 
from ..dbcrud import you_module 

В противном случае, если вы хотите другое решение , вы можете отредактировать переменную $PYTHONPATH следующим образом:

dbcrud.py:

class DBCrud: 
    def __init__(self): 
     print("I'm DBCrud'") 

script1.py

# Add the parent directory to your module 
# by using this kind of hack 
import os, sys 
sys.path.insert(1, os.path.join(sys.path[0], '..')) 
# Then import your module 
from dbcrud import DBCrud 

class Script1: 
    def __init__(self): 
     print("I'm Script1'") 
     DBCrud.__init__(self) 

# test 
if __name__ == '__main__': 
    app = Script1() 

Теперь из database/ папки или database/table_insers/ папки вы можете запустить тестовый пример:

~$ pwd 
/user/path/database/table_inserts 
~$ python3 script1.py 

Выход:

I'm Script1' 
I'm DBCrud' 

И:

~$ pwd 
/user/path/database 
~$ python3 table_inserts/script1.py 

Выход:

I'm Script1' 
I'm DBCrud' 
+2

Спасибо за этот длинный пост. Я просто чувствую, что это должно быть проще? – Jshee

+0

Да, это просто, вам нужно просто добавить 'sys.path.insert (1, os.path.join (sys.path [0], '..'))' на ваш 'script1.py', а затем импортировать модуль там. Если вы не можете сделать это правильно, следуйте моему примеру, и все будет правильно. –

+0

@ Jshee. Игнорируйте 99% этого ответа. Просто добавьте второй init в database/table_inserts –