Форум сайта python.su
Пишу на линуксе, но работать должно и на виндовс.
Путь главного файла:
/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 ("Файл не найден")
Офлайн
Kyrym
У вас импортируемый модуль лежит в корне проекта, а исполняемый во вложенном каталоге? Вам не кажется, что это как-то неправильно?
Офлайн
FishHookЯ, помню, читал, что правильно выстраивать архитектуру наоборот, но сейчас у меня получается таким образом.
KyrymУ вас импортируемый модуль лежит в корне проекта, а исполняемый во вложенном каталоге? Вам не кажется, что это как-то неправильно?
Офлайн
KyrymРазберитесь в следующем:
Да и вообще, питоном ведь можно запускать разные программы
KyrymЕсли оно не работает значит не получается.
но сейчас у меня получается таким образом.
KyrymЗапускать и импортировать это разные вещи.
Да и вообще, питоном ведь можно запускать разные программы,
KyrymОни абсолютно одинаковые.
Только на сколько я понял, методы открытия файлов на винде и линуксе разные
Офлайн
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
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)
Офлайн
PEHDOMВот как оно делается. Теперь я разобрался.
sys.path.append(a1_path) import test1
PEHDOMМне кажется, что ничего сложного и трудного здесь нет. По сути добавили нужный каталог в sys.path и всё.
хотя конечно это как гланды через жопу рвать..
doza_andПро документацию не скажу, но люди часто так советуют.
Покажите где в документации написано что в import можно использовать “..” или вообще пути к файлам.
doza_and1). “os.path.normpath(path) - нормализует путь, убирая избыточные разделители и ссылки на предыдущие директории. На Windows преобразует прямые слеши в обратные. ” - это для чего тогда?
Они абсолютно одинаковые
Офлайн
KyrymНаверное бабки на скамейке. Или вы на этом форуме видели? Покажите где, интересно кто такое мог придумать.
но люди часто так советуют.
KyrymЭто запуск, причем . открыть файл это
os.startfile - в линуксе не работает.
with open(filename,"r") as f: data = f.read() ....
subprocess.check_call(cmd, shell=True)
Офлайн
doza_andЯ уже закрыл те вкладки, это снова искать надо, а в истории чёрт ногу сломит.
Наверное бабки на скамейке. Или вы на этом форуме видели? Покажите где, интересно кто такое мог придумать.
Офлайн
KyrymЭто ошибка. Пиши для каждой системы свою, индивидуальную версию программы. Чем больше будешь писать, тем больше они будут различаться и расходиться по коду. А в лине виндовая скованность и обход разных виндовых глюков вообще нафиг не нужен, только засоряет программу. Но самое главное, есть различия во взаимодействии скрипта с окружением в системе. Те же файлы читаются и пишутся по-разному. В винде конец строки в файле вообще другой, отличный от линя. Там, короче, очень много всего разного, незаметного на первый взгляд, поэтому версии надо разделять.
Пишу на линуксе, но работать должно и на виндовс.
Офлайн