2016-04-18 2 views
3

Я поставил вопрос на рисунке ниже:Импорт модулей из соседней папки в Python

enter image description here

EDIT Вопрос, поставленный рядом с фигурой является:

Как я make script_A1 импортировать функцию из script_B2?

Похожие вопросы были заданы раньше. Но большинство ответов предлагают добавить модуль/скрипт/пакет (независимо) в переменную PATH. Например:

sys.path.append('...') 

Но добавление модуля в переменную PATH просто не так. Я не хочу каким-либо образом изменять свою систему. Когда мое приложение закрывается, я хочу, чтобы моя среда Python была чистой и «нетронутой». Я боюсь, что добавление неконтролируемых модулей в переменные PATH в моей системе позже вызовет головные боли.

Спасибо за помощь мне :-)

+1

Добавление к 'sys.path' не является постоянным изменением; он ничего не сделает с «PATH» или «PYTHONPATH». Вероятно, это не самый лучший способ сделать это, но у вас не будет проблем, о которых вы беспокоитесь. – user2357112

+0

Я не знаю, почему кто-то отказался от моего вопроса. Пожалуйста, оставьте комментарий перед тем, как сделать downvote, чтобы объяснить, что я могу сделать лучше. Я разумный человек. Я готов слушать. –

+2

Ваш ответ должен быть в текстовой форме, не загружен как изображение: http://meta.stackoverflow.com/questions/318618/proposal-adding-the-text-in-text-form-in-the-close-reason –

ответ

2

Вы можете использовать трюк добавления верхнюю папку путь:

import sys 
sys.path.append('..') 
import folderB.something 

Вы также можете использовать imp.load_source, если вы предпочитаете.

+0

Кто-то прокомментировал: _ «Добавление к sys.path не является постоянным изменением, оно ничего не сделает с PATH или PYTHONPATH» _. Это правда? Потому что это было бы здорово. –

+1

Да, это фактически не изменит системные переменные. Это повлияет только на ваш текущий процесс скрипта. –

+0

Это замечательно. Спасибо. Что это за последняя часть вашего ответа? Об использовании _imp.load source_? –

0

Put это в верхней части script_A1;

from folderB.script_B2 import YourClass as your_class

+1

Прошу прощения, но этот подход не работает. Я пробовал это. Но спасибо за помощь;) –

0

Я думаю, что я решил проблему.

В следующем виде вы можете добавить родительский каталог в PATH. Поместите это в верхней части script_A1:

import sys 
import os 
myDir = os.path.dirname(os.path.abspath(__file__)) 
parentDir = os.path.split(myDir)[0] 
if(sys.path.__contains__(parentDir)): 
    print('parent already in path') 
    pass 
else: 
    print('parent directory added') 
    sys.path.append(parentDir) 

# Now comes the rest of your script 

Вы можете убедиться, что родительский каталог myProject действительно добавляется в PATH распечатав:

print(sys.path) 

Поскольку родительский каталог myProject теперь частью PATH, вы можете импортировать скрипты/модули/независимо от любого из своих подкаталогов. Это, как вы импортировать script_B2 из folder_B:

import folder_B.script_B2 as script_B2 

После закрытия приложения, вы можете проверить, если среда Python восстанавливается в исходное состояние. просто распечатайте PATH еще раз и проверьте, исчез ли каталог, который вы добавили.