Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 4, 2018 11:46:30

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

Импорт модуля уровнем выше

Пишу на линуксе, но работать должно и на виндовс.
Путь главного файла:
/home/name/Документы/Питон/Telo/Golova.py
Импортируем модуль:
/home/name/Документы/Питон/a1.py

Сначала пробовал относительный путь:

 from ../a1 import p
print(p)
Не заработало.

Далее написал такой вот код:
 def dynamic_import(module):
    return importlib.import_module(module)
# имя испоняемого файла:
filename = inspect.getframeinfo(inspect.currentframe()).filename
# путь исполняемого файла:
path_tec = os.path.dirname(os.path.abspath(filename))
# каталог верхнего уровня:
path_app, _ = os.path.split(path_tec)
print('path_app =',path_app)
# путь к искомому файлу:
modul_name = os.path.join(path_app, 'a1')
print('modul_name =',modul_name)
# импорт
if os.path.exists(modul_name): # файл существует
    a1 = dynamic_import(modul_name)
    #a1 = dynamic_import(r'/home/name/Документы/Питон/a1')
    print(a1.p)
else: 
    print ("Файл не найден")
И тоже безуспешно.

Офлайн

#2 Янв. 4, 2018 11:55:19

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Импорт модуля уровнем выше

Kyrym
У вас импортируемый модуль лежит в корне проекта, а исполняемый во вложенном каталоге? Вам не кажется, что это как-то неправильно?



Офлайн

#3 Янв. 4, 2018 14:32:33

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

Импорт модуля уровнем выше

FishHook
KyrymУ вас импортируемый модуль лежит в корне проекта, а исполняемый во вложенном каталоге? Вам не кажется, что это как-то неправильно?
Я, помню, читал, что правильно выстраивать архитектуру наоборот, но сейчас у меня получается таким образом.
Да и вообще, питоном ведь можно запускать разные программы, которые могут находиться где угодно и не привязываться к исполняемому файлу. Только на сколько я понял, методы открытия файлов на винде и линуксе разные, да и синтаксис тамих путей отличается.

Офлайн

#4 Янв. 4, 2018 14:55:20

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Импорт модуля уровнем выше

Kyrym
Да и вообще, питоном ведь можно запускать разные программы
Разберитесь в следующем:
Kyrym
но сейчас у меня получается таким образом.
Если оно не работает значит не получается.
Kyrym
Да и вообще, питоном ведь можно запускать разные программы,
Запускать и импортировать это разные вещи.
Покажите где в документации написано что в import можно использовать “..” или вообще пути к файлам.
Kyrym
Только на сколько я понял, методы открытия файлов на винде и линуксе разные
Они абсолютно одинаковые.




Офлайн

#5 Янв. 4, 2018 15:03:41

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Импорт модуля уровнем выше

Kyrym
да и синтаксис тамих путей отличается.
для этого есть os.path
в общем и целом както так:
 import sys
from os import path
a1_folder = 'a1'
print('running script:', path.abspath(__file__) )
upper_folder = (path.dirname( path.dirname(path.abspath(__file__)))) # путь с папке на уровень выше
print('upper folder:', upper_folder)
a1_path = path.join(upper_folder, a1_folder) # путь к папке а1
print('a1 full path', a1_path)
sys.path.append(a1_path)
import test1
test1.func()
>>>
running script: Y:\SOFT\Portable Python 3.2.5.1\App\My_scripts\import_from_anywhere\bin\main.py
upper folder: Y:\SOFT\Portable Python 3.2.5.1\App\My_scripts\import_from_anywhere
a1 full path Y:\SOFT\Portable Python 3.2.5.1\App\My_scripts\import_from_anywhere\a1
is test1 module from a1 folder, my path: Y:\SOFT\Portable Python 3.2.5.1\App\My_scripts\import_from_anywhere\a1\test1.py
is func from test1 module in a1 folder


test1.py
 from os import path
def func():
    print('is func from test1 module in a1 folder')
print('is test1 module from a1 folder, my path: ', path.abspath(__file__) )
хотя конечно это как гланды через жопу рвать..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 4, 2018 15:07:12)

Офлайн

#6 Янв. 4, 2018 17:11:35

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

Импорт модуля уровнем выше

PEHDOM
sys.path.append(a1_path) import test1
Вот как оно делается. Теперь я разобрался.
PEHDOM
хотя конечно это как гланды через жопу рвать..
Мне кажется, что ничего сложного и трудного здесь нет. По сути добавили нужный каталог в sys.path и всё.
doza_and
Покажите где в документации написано что в import можно использовать “..” или вообще пути к файлам.
Про документацию не скажу, но люди часто так советуют.
doza_and
Они абсолютно одинаковые
1). “os.path.normpath(path) - нормализует путь, убирая избыточные разделители и ссылки на предыдущие директории. На Windows преобразует прямые слеши в обратные. ” - это для чего тогда?
2) os.startfile - в линуксе не работает.

Офлайн

#7 Янв. 4, 2018 19:24:33

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Импорт модуля уровнем выше

Kyrym
но люди часто так советуют.
Наверное бабки на скамейке. Или вы на этом форуме видели? Покажите где, интересно кто такое мог придумать.
Kyrym
os.startfile - в линуксе не работает.
Это запуск, причем . открыть файл это
 with open(filename,"r") as f:
    data = f.read()
    ....
Код абсолютно одинаков во всех ОС. filename должно быть валидное имя файла. Все. Как вы формируете имя файла к процессу его открытия не имеет ни малейшего отношения.
По поводу startfile
Рекомендую использовать не его а
 subprocess.check_call(cmd, shell=True)
будет работать везде а от startfile практически не отличается. Думаю startfile сделали для тех кто много пользовался winapi.



Офлайн

#8 Янв. 4, 2018 20:11:26

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

Импорт модуля уровнем выше

doza_and
Наверное бабки на скамейке. Или вы на этом форуме видели? Покажите где, интересно кто такое мог придумать.
Я уже закрыл те вкладки, это снова искать надо, а в истории чёрт ногу сломит.

Офлайн

#9 Янв. 5, 2018 02:50:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Импорт модуля уровнем выше

Kyrym
Пишу на линуксе, но работать должно и на виндовс.
Это ошибка. Пиши для каждой системы свою, индивидуальную версию программы. Чем больше будешь писать, тем больше они будут различаться и расходиться по коду. А в лине виндовая скованность и обход разных виндовых глюков вообще нафиг не нужен, только засоряет программу. Но самое главное, есть различия во взаимодействии скрипта с окружением в системе. Те же файлы читаются и пишутся по-разному. В винде конец строки в файле вообще другой, отличный от линя. Там, короче, очень много всего разного, незаметного на первый взгляд, поэтому версии надо разделять.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version