Лепшы спосаб імпарту іншых модуляў ў Python, калі PYTHONPATH не можа быць зменены?

Я кадаваньне майго першага праекта ў Python, і я не ўпэўнены ў тым, як справіцца з імпартам. Я працую на кампутарах у маім універсітэце, і не можа змяніць пераменную PYTHONPATH. Я таксама працую над гэтым праектам з розных кампутараў/ОСС (так што шлях да праекту не заўсёды тое ж самае).

У мяне ёсць некалькі розных модуляў ў розных папках, якія ўсё імпартуюць адзін аднаго. У цяперашні час я атрымліваю шлях да аднаго модулю ад іншага, выкарыстоўваючы file_path = os.path.abspath (__ __ файл) , а затым зваротаў праз каталогі, а затым дадаўшы тэчку з патрэбным модулем ў ім. Гэта затым дадаюць да PYTHONPATH з sys.path.append (symantic_root) .

Гэтая сістэма працуе, але ён заканчвае тым, што вельмі брудна, і ёсць шмат дубляваць кода ў пачатку кожнага модуля, напрыклад:

import os
import sys
# Get the path to the directory above the directory this file is in, for any system
file_path = os.path.abspath(__file__)
root_path = os.path.dirname(os.path.dirname(file_path))
# Get the paths to the directories the required modules are in
symantic_root = os.path.join(root_path, "semantic_analysis")
parser_root = os.path.join(root_path, "parser")
# Add the directories to the path variable
sys.path.append(symantic_root)
sys.path.append(parser_root)
import semantic_analyser
import jaml

Любыя кансультацыі па лепшы спосаб структураваць праект, такія як гэта будзе ацэнена.

1

3 адказы

Па-першае, стварыць просты main.py скрыпт, які забяспечвае адзіную кропку ўваходу для прыкладання. Напрыклад:

if __name__ == '__main__':

    import sys   
    from package import app

    sys.exit(app.run())

Затым стварыце пакет верхняга ўзроўню, які аб'ядноўвае ўсе вашыя модулі, і забяспечваюць кропку доступу для яго у тым жа каталогу як main.py . Затым вы павінны быць у стане ліквідаваць усе маніпуляцыі кода шляху, і проста выкарыстоўваць цалкам названыя аператар імпарту, такія як з функцыі package.module імпарту з любога модуля ў вашым дадатку.

1
дададзена
@Alty. Вы не зрабілі ясна ў вашым пытанні, у якой ступені вы можаце рэструктураваць тэчкі вашыя модулі ў цяперашні час, і я не быў упэўнены, што АС вы карыстаецеся - так што «кропка доступу» проста азначае, што просты каталог або знакавая спасылка і г.д. Галоўнае гэта знайсці спосаб вярнуць усе модулі разам у адным пакеце - тады ўсё становіцца значна прасцей кіраваць (спадзяюся, што я не проста канстатую відавочнае тут).
дададзена аўтар ekhumoro, крыніца
Дзякуй за Ваш адказ. Я проста блукаў, што вы маеце на ўвазе менавіта, калі вы кажаце «прадастаўляюць пункту доступу». Гэта нешта рабіць з <Ь> INIT .py файл?
дададзена аўтар Will Sewell, крыніца

Па-першае, вы павінны прачытаць некаторыя рэчы пра шляхі Python ў наступных дакументах:

Для таго, каб вырашыць вашу праблему, верагодна, можна выкарыстоўваць РТН ( python- пошук траекторыяй ) файл, які змяшчае спіс шляхоў існуюць вашыя неабходныя модулі ст.

Тады з асноўнага сцэнара вы маглі б зрабіць

import site
site.addsitedir(".")

якая аўтаматычна дадае гэтыя каталогі PYTHONPATH .

1
дададзена

Вы не згадалі, што АС вы працуеце. Большая частка гэтага адказу мяркуе сераду Linux (ці Unix-падобныя). Калі вы на Windows, хтосьці павінен будзе тэлефанаваць ст.

Гэта не ясна з вашага прыкладу, чаму вы праходзіце праз усе гэтыя скрыўленні. Па-першае, як вы не ў стане змяніць PYTHONPATH ? Гэта проста зменная асяроддзі абалонкі. Калі вы можаце ўвайсці і запусціць Python, вы відавочна маеце неабходны доступ, каб усталяваць свае ўласныя зменныя асяроддзі.

Але я нават не ўпэўнены, што гэта неабходна. Калі б вы былі проста ўсталяваць ўсе карыстацкія модулі ў свой уласны каталог бібліятэкі, і ўсталяваць .pth файлы як прапанавана vinilios, вы маглі б проста зрабіць нешта накшталт гэтага:

import site
import os

site.addsitedir(os.path.expanduser('~/lib/python'))

Вы таксама можаце паглядзець у virtualenv пакет, які дазваляе ствараць сваю ўласную сераду Python у якім вы можаце ўсталяваць свае ўласныя пакеты. Гэта вельмі зручна, калі вам трэба ўсталяваць модулі, якія не даступныя ў сістэме Python.

0
дададзена