Ana qovluqdan idxal modulları

Mən Python 2.5 edirəm.

Bu mənim qovluq ağacımdır:

 ptdraft/ nib.py simulations/ life/ life.py 

( __init__.py də hər bir qovluğa __init__.py , okunabilirlik üçün buraxılmış)

nib modulu life modulundan necə alınır? Mən sys.path istifadə etmədən ümid edirəm.

Qeyd Əsas executable ptdraft qovluğunda yerləşir.

429
03 апр. Ram Rachum 03 Aprel tarixində təyin edildi. 2009-04-03 17:08 '09 at 5:08 pm 2009-04-03 17:08
@ 18 cavab

Göründüyü kimi, bu problem modulun əsas kataloqda və ya bir şey olduğu ilə bağlı deyil.

ptdraft üçün ptdraft olan bir kataloq əlavə etməlisiniz

Siz import nib səninlə işləmişdi, yəqin ki, ptdraft (onun valideynindən başqa) PYTHONPATH-a əlavə etdiniz.

89
03 апр. cavab verildi hasen 03 apr. 2009-04-03 17:09 '09 at 17:09 'da 2009-04-03 17:09

Nisbi idxal istifadə edə bilərsiniz (python> = 2.5):

 from ... import nib 
border=0

(Python 2.5-də yeniliklər) PEP 328: Mütləq və nisbi idxal

EDIT : başqa bir nöqtə əlavə etdi. 'İki paketi dırmaşmaq

505
03 апр. cavab f3lix 03 apr verilir . 2009-04-03 19:17 '09 at 7:17 PM 2009-04-03 19:17

Nisbi idxal (məsələn, from.. import mymodule ) yalnız paketdə işləyir. Mövcud modulunuzun əsas qovluğunda olan "mymodule" idxal etmək üçün:

 import os,sys,inspect currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) parentdir = os.path.dirname(currentdir) sys.path.insert(0,parentdir) import mymodule 

redaktə : __file__ atributu həmişə verilmir. os.path.abspath(__file__) istifadə etmək əvəzinə, indi mövcud faylın fayl adını (və yolunu) almaq üçün yoxlama modulundan istifadə etməyi təklif edirəm.

199
22 июня '12 в 17:30 2012-06-22 17:30 cavab 22 iyun 2012-ci il saat 17.30-da Remy'ye verilir. 2012-06-22 17:30

Modulunuzun PYTHONPATH qovluğuna əlavə edilmədiyi halda, Python tərcüməçisinin idxal modulları axtarır olduğu proqramda sys.path siyahısını dəyişə bilərsiniz, python sənədlərində deyilir:

Spam adı ilə bir modul idxal edildikdə, tərcüməçi əvvəlcə həmin adı ilə daxili modulları axtarır. Tapılmadıqda, sys.path dəyişən tərəfindən göstərilən dizinlər siyahısında spam.py adlı bir fayl axtarır. sys.path bu yerlərdən başlayıb:

  • skript girişi (və ya mövcud kataloq) olan kataloq.
  • PYTHONPATH (shell dəyişən PATH ilə eyni sintaksis ilə kataloq adlarının siyahısı).
  • default ayarından asılıdır.

Başlatma işleminden sonra, Python proqramları sys.path'i değiştirebilir. İcra olunan skriptləri əks etdirən kataloq, standart kitabxananın yolundan qabaq, axtarış yolunun başlanğıcında yerləşdirilir. Bu, dizindeki skriptlər kitabxana qovluğunda eyni adı olan modulların yerinə yüklənəcəkdir. Əvəzləmə tələb olunmursa, bu, bir səhvdir.

Bunu bildiyiniz halda, proqramda aşağıdakıları edə bilərsiniz:

 import sys # Add the ptdraft folder path to the sys.path list sys.path.append('/path/to/ptdraft/') # Now you can import your module from ptdraft import nib # Or just import ptdraft 
45
17 февр. Cavab 17 fevralda Rikardo Murillo tərəfindən verilir. 2012-02-17 18:30 '12 saat 18:30 'da 2012-02-17 18:30' da

Sys.path-də göstərilən "modul axtarış yolunda" əməliyyat sistemindən istifadə edə bilərsiniz. Beləliklə, asanlıqla üst kataloq əlavə edə bilərsiniz, məsələn aşağıdakı

 import sys sys.path.insert(0,'..') 

Bir ana valideyn kataloq əlavə etmək istəyirsinizsə,

 sys.path.insert(0,'../..') 
35
25 февр. Cavab 25 fevralda Şinbero tərəfindən verilir. 2015-02-25 09:37 '15 'də saat 09:37' da 2015-02-25 09:37

Əlaqədar paketlərdən idxal haqqında sualına oxşar cavab verdim. Buradan görə bilərsiniz . Aşağıdakı Python 3.6.5, (Anaconda, conda 4.5.1), bir Windows 10 maşın test edilir.

Sys.path -hacks və ya nisbi idxal olmadan həlli

Özelleştirin

Sualda olduğu kimi eyni qovluq quruluşunu da götürürəm

 . └── ptdraft ├── __init__.py ├── nib.py └── simulations ├── __init__.py └── life ├── __init__.py └── life.py 

Mən dəvət edirəm . kök qovluq və mənim vəziyyətim C:\tmp\test_imports .

tədbirlər

1) Setup.py faylını kök qovluğa əlavə edin.

setup.py nin məzmunu ola bilər

 from setuptools import setup, find_packages setup(name='myproject', version='1.0', packages=find_packages()) 

Prinsipcə "hər hansı" setup.py işləyəcək. Bu, minimal iş nümunəsidir.

2) Virtual mühiti istifadə edin

Virtual mühitlə tanış olsanız, birini aktivləşdirin və sonrakı addımlara keçin. Virtual mühitlərdən istifadə etmək tamamilə vacib deyil, lakin onlar uzun müddətdə sizə kömək edəcəkdir (birdən çox layihə var ..). Ən əsas addımlar (kök qovluğunda işlədilir)

  • Virtual mühit yaradın
    • python -m venv venv
  • Virtual mühiti aktivləşdirin
    • ./venv/bin/activate ./venv/bin/activate (Linux) və ya ./venv/Scripts/activate (Win)

Bununla əlaqədar daha ətraflı məlumat üçün, "Python Virtual Env Tutorial" və s. Yəqin ki, yaratmaq, aktivləşdirmək və ləğv etməklə yanaşı, heç bir digər əmrlərə ehtiyacınız olmayacaq.

Bir virtual mühit yaratdığınız və aktivləşdirildikdən sonra, konsolunuz brauzerlərdə virtual mühitin adını verməlidir.

 PS C:\tmp\test_imports> python -m venv venv PS C:\tmp\test_imports> .\venv\Scripts\activate (venv) PS C:\tmp\test_imports> 

3) pip sizin layihənizi düzəldilir vəziyyətdə qoydu

Üst səviyyəli myproject paketini pip ilə quraşdırın. Bu hiylə qurarkən bayraqdan istifadə etməkdir. Beləliklə, düzəldilir vəziyyətdə quraşdırılır və .py fayllarına edilən bütün dəyişikliklər avtomatik olaraq quraşdırılmış paketə daxil edilir.

Kök dizininde çalıştırın

pip install -e. (nöqtəyə diqqət edin, "cari qovluq" deməkdir)

Siz həmçinin pip freeze quraşdırıldığını görə bilərsiniz

 (venv) PS C:\tmp\test_imports> pip install -e . Obtaining file:///C:/tmp/test_imports Installing collected packages: myproject Running setup.py develop for myproject Successfully installed myproject (venv) PS C:\tmp\test_imports> pip freeze myproject==1.0 

4) Hər idxala bir əsas mainfolder əlavə edərək idxal

Bu nümunədə mainfolder olacaqdır. Bunun üstünlüyü, digər modul adlarıyla (standart Python kitabxanasından və ya üçüncü tərəf modullarından) ad ziddiyyətlərinə rast gəlmir.


İstifadə nümunəsi

nib.py

 def function_from_nib(): print('I am the return value from function_from_nib!') 

life.py

 from ptdraft.nib import function_from_nib if __name__ == '__main__': function_from_nib() 

Life.py

 (venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py I am the return value from function_from_nib! 
30
06 мая '18 в 0:24 2018-05-06 00:24 Cavab np8 06 May '18 'də 0:24 2018-05-06 00:24' də verilir

Python 2 haqqında çox şey bilmirəm.
Python 3-də, üst qovluq aşağıdakı kimi əlavə edilə bilər:

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

... və ondan modulları idxal edə bilərsiniz

29
14 февр. cavab 14 fevralda Rob Ellenbroek tərəfindən verilir. 2017-02-14 22:57 '17 saat 10:57 'da 2017-02-14 22:57

Sys.path-də (mənim üçün çalışır) ana kataloq daxilində daha ümumi bir həlldir:

 import os.path, sys sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)) 
23
14 февр. Cavab 14 fevralda Mike tərəfindən verilir . 2014-02-14 19:09 '14 at 19:09 2014-02-14 19:09

İşdə sadə bir cavabdır ki, bunun necə işlədiyini, kiçik və kross-platforma baxın.
Yalnız quraşdırılmış modulları ( os , sysinspect ) istifadə edir, ona görə də işləməlidir
hər hansı bir əməliyyat sistemi (OS), çünki Python bunun üçün nəzərdə tutulmuşdur.

Qısa cavab kodu - daha az xətt və dəyişənlər

 from inspect import getsourcefile import os.path as path, sys current_dir = path.dirname(path.abspath(getsourcefile(lambda:0))) sys.path.insert(0, current_dir[:current_dir.rfind(path.sep)]) import my_module # Replace "my_module" here with the module name. sys.path.pop(0) 

Bununla müqayisədə daha az xətt üçün, ikinci xətt import os.path as path, sys, inspect ,
inspect. getsourcefile (satır 3) başında və ilk satırı silin.
- ancaq bütün modulu idxal edir, buna görə daha çox vaxt, yaddaş və resurslar ola bilər.

Cavabım üçün kod (uzun versiya)

 from inspect import getsourcefile import os.path import sys current_path = os.path.abspath(getsourcefile(lambda:0)) current_dir = os.path.dirname(current_path) parent_dir = current_dir[:current_dir.rfind(os.path.sep)] sys.path.insert(0, parent_dir) import my_module # Replace "my_module" here with the module name. 

Cavabdan bir nümunə istifadə edir. Cari yolu necə əldə etmək olar
python-da yürütülebilir fayl? Daxili alətdən istifadə edərək iş kodunun mənbəyini (fayl adını) tapın.

 from inspect import getsourcefile from os.path import abspath 

Əlavə olaraq, qaynaq faylını tapmaq istədiyiniz yerdə sadəcə istifadə edin:

 abspath(getsourcefile(lambda:0)) 

sys.path , Python yollarının siyahısı üçün bir yol əlavə edir
çünki Python bu qovluqdan modulları idxal etməyə imkan verir.

sys.path.pop(0) idxal olunduqdan sonra sys.path.pop(0) işini yeni bir xətdə həyata keçirmək məsləhətdir.
bu əlavə qovluğa başqa bir idxal modul ilə eyni adı olan bir modul var
sonra proqramda. İthalat əvvəlində əlavə edilmiş siyahı maddəni və digər yolları yox etməlisiniz.
Proqramınız başqa modulları idxal etmirsə, fayl yolunu silmək təhlükəsizdir, çünki
Proqram tamamlandıqdan sonra (və ya Python qabığı yenidən başlasa), sys.path edilən dəyişikliklər yox olur.

Değişken fayl adı haqqında notlar

__file__ , fayl yolunu / faylını almaq üçün dəyişən __file__ istifadə etmir
kodu, çünki istifadəçilər burada tez-tez etibarsız hesab edirlər . Bunu istifadə etməməlisiniz
ana qrupdan modulları digər şəxslər tərəfindən istifadə edilən proqramlara idxal etmək.

Bu işə yaramayan bəzi nümunələr ( bu suala cavab verin):

• bəzi platformalarda tapıla bilməz • bəzən faylın tam yoludur

  • py2exe sahib deyil, ancaq bir __file__ var
  • __file__ execute() __file__ ilə IDLE çalışan __file__ eksik
  • OS X 10.6, burada NameError: global name '__file__' is not defined almaq NameError: global name '__file__' is not defined
21
05 нояб. cavab verdi Edward 05 noyabr. 2015-11-05 00:06 '15 at 0:06 2015-11-05 00:06

Mənim üçün, ən qısa və ən sevdiyim oneliner, ana kataloqa daxil olmaq üçün:

 sys.path.append(os.path.dirname(os.getcwd())) 

və ya

 sys.path.insert(1, os.path.dirname(os.getcwd())) 

os.getcwd (), os.path.dirname (directory_name) köçürülmüş olan kataloqun adını qaytarır.

Əslində, mənim fikrimcə, Python layihəsinin arxitekturası uşaq kataloqundan heç bir modulun üst kataloqdan heç bir modul istifadə etməməsi üçün həyata keçirilməlidir. Bu kimi bir şey olarsa, layihə ağacını düşünməlisiniz.

Başqa bir yol da PYTHONPATH sisteminin ətraf mühit dəyişkənliyinə əsas kataloq əlavə etməkdir.

6
12 апр. Cavab zviad 12 apr verilir . 2018-04-12 16:48 '18 saat 04:48 'da 2018-04-12 16:48

import sys sys.path.append('../')

6
06 сент. Cavab Andong Zhan tərəfindən verilir 06 Sep. 2016-09-06 02:07 '16 at 2:07 2016-09-06 02:07

Paketin __init__.py faylları ilə __init__.py , pathli kitabxana (Python-da daxil edilir: Python 3.4) PYTHONPATH üçün üst kataloq yolunu əlavə etmək üçün çox qısa və intuitiv edir:

 import sys from pathlib import Path sys.path.append(str(Path('.').absolute().parent)) 
4
31 марта '16 в 16:08 2016-03-31 16:08 cavab 31 Mart '16' da 16:08 2016-03-31 16:08 'a verilir

Yuxarıda göstərilən həllər də işləyir. Bu problemin başqa bir həlli

Üst səviyyə kataloqdan bir şey idxal etmək istəyirsinizsə. Sonra

 from ...module_name import * 

Üst modeldən istənilən modul idxal etmək istəyirsinizsə. Sonra

 from ..module_name import * 

Üst modeldən istənilən modul idxal etmək istəyirsinizsə. Sonra

 from ...module_name.another_module import * 

İstəyirsinizsə, hər hansı bir üsulu idxal edə bilərsiniz.

1
28 июля '18 в 14:15 2018-07-28 14:15 Cavab Ravin Gupta tərəfindən 28 iyul '18 'də 14:15 2018-07-28 14:15' də verilir

Kitabxanalarla işləmək. Nib adlı bir kitabxana yaradın, setup.py-ni istifadə edərək, quraşdırın, sayt paketlərində olsun və problemləriniz həll olunacaq. Bir paketdə etdiyiniz hər şeyi doldurmanıza ehtiyac yoxdur. Fərq edin.

1
24 сент. cavab user3181121 24 sep tərəfindən verilir . 2015-09-24 23:56 '15 at 11:56 pm 2015-09-24 23:56

keçmişdə olduğu kimi eyni tərzi, lakin daha az xəttdə: P

 import os,sys parentdir = os.path.dirname(__file__) sys.path.insert(0,parentdir) 
Fayl

işlədiyiniz yeri qaytarır

1
16 окт. cavab YFP 16 okta verilir . 2013-10-16 20:25 '13 saat 20:25 'da 2013-10-16 20:25

Siz idxal etmək istədiyiniz modulun yoluna simvolik bir keçid edə bilərsiniz və sonra idxal etmək üçün simvolik linkdən istifadə edə bilərsiniz. Python dist-paketlərindəki simvolik bir link yaradın.

Simvolik link yaratmaq üçün:

 ln -s "/path/to/ptdraft" "/path/to/python/dist/packages/module_symlink_name" 

Bir modul bir skriptə idxal etmək üçün:

 from module_symlink_name import nib 

Sistem yolunda python yolunu və ya döngəni ixrac etməyə ehtiyac yoxdur.

0
15 нояб. 15 noyabr tarixində PalFS tərəfindən verilən cavab. 2017-11-15 11:46 '17 saat 11:46 'də 2017-11-15 11:46' də

Linux'da, "həyat" qovluğundan nib.py faylına yumşaq bir keçid yarada bilərsiniz. Sonra sadəcə onu idxal edə bilərsiniz:

 import nib 
-1
25 окт. Cavab 25 oktyabrda Erel Segal-Halevi tərəfindən verilir . 2017-10-25 17:16 '17 də 5:16 'də 2017-10-25 17:16

sistemə kataloq yolu əlavə edə bilərsiniz

 import sys import os sys.path.append(os.path.__file__) 
-3
22 июля '16 в 8:54 2016-07-22 08:54 Cavab 22 İyul, '16 'da 8:54 2016-07-22 08:54 arun.rajput verilir

bağlı digər suallar və ya soruşun