Sys.path hack'lerinden bıktınız mı?
Bir sürü var sys.path.append
hack var, ama problemi çözmenin alternatif bir yolunu buldum.
özet
- Kodu bir klasöre sarın (ör.
packaged_stuff
)
- Setuptools.setup () yöntemini
setup.py
kullandığınız create komut dosyasını kullanın .
- Pip ile paketi düzenlenebilir durumda yükleyin
pip install -e <myproject_folder>
- Kullanarak içe aktar
from packaged_stuff.modulename import function_name
Kurmak
Başlangıç noktası, sağladığınız ve adlı bir klasöre sarılmış dosya yapısıdır myproject
.
.
└── myproject
├── api
│ ├── api_key.py
│ ├── api.py
│ └── __init__.py
├── examples
│ ├── example_one.py
│ ├── example_two.py
│ └── __init__.py
├── LICENCE.md
├── README.md
└── tests
├── __init__.py
└── test_one.py
.
Kök klasörü çağıracağım ve benim örneğimde bu dosyada bulunur C:\tmp\test_imports\
.
api.py
Test örneği olarak aşağıdakileri kullanalım ./api/api.py
def function_from_api():
return 'I am the return value from api.api!'
test_one.py
from api.api import function_from_api
def test_function():
print(function_from_api())
if __name__ == '__main__':
test_function()
Test_one komutunu çalıştırmayı deneyin:
PS C:\tmp\test_imports> python .\myproject\tests\test_one.py
Traceback (most recent call last):
File ".\myproject\tests\test_one.py", line 1, in <module>
from api.api import function_from_api
ModuleNotFoundError: No module named 'api'
Ayrıca göreli ithalat denemek işe yaramaz:
Kullanılması from ..api.api import function_from_api
halinde neden olacaktır
PS C:\tmp\test_imports> python .\myproject\tests\test_one.py
Traceback (most recent call last):
File ".\tests\test_one.py", line 1, in <module>
from ..api.api import function_from_api
ValueError: attempted relative import beyond top-level package
adımlar
- Kök seviyesi dizinine bir setup.py dosyası oluşturun
İçindekiler setup.py
*
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
- Sanal ortam kullanma
Sanal ortamlara aşina iseniz, birini etkinleştirin ve sonraki adıma geçin. Sanal ortamların kullanılması kesinlikle gerekli değildir , ancak uzun vadede size gerçekten yardımcı olacaktır (1'den fazla projeniz devam ederken ..). En temel adımlar (kök klasörde çalıştır)
- Sanal env oluştur
- Sanal env'yi etkinleştir
source ./venv/bin/activate
(Linux, macOS) veya ./venv/Scripts/activate
(Win)
Bu konuda daha fazla bilgi edinmek için, sadece "python sanal env öğretici" veya benzeri Google. Muhtemelen oluşturma, etkinleştirme ve devre dışı bırakma dışında başka komutlara ihtiyacınız yoktur.
Bir sanal ortam oluşturup etkinleştirdikten sonra, konsolunuz parantez içinde sanal ortamın adını vermelidir
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
ve klasör ağacınız şöyle görünmelidir **
.
├── myproject
│ ├── api
│ │ ├── api_key.py
│ │ ├── api.py
│ │ └── __init__.py
│ ├── examples
│ │ ├── example_one.py
│ │ ├── example_two.py
│ │ └── __init__.py
│ ├── LICENCE.md
│ ├── README.md
│ └── tests
│ ├── __init__.py
│ └── test_one.py
├── setup.py
└── venv
├── Include
├── Lib
├── pyvenv.cfg
└── Scripts [87 entries exceeds filelimit, not opening dir]
- pip projenizi düzenlenebilir durumda yükleyin
myproject
Kullanarak üst düzey paketinizi kurun pip
. Hile, -e
yükleme yaparken bayrağı kullanmaktır . Bu şekilde düzenlenebilir bir duruma yüklenir ve .py dosyalarında yapılan tüm düzenlemeler otomatik olarak yüklü pakete dahil edilir.
Kök dizinde çalıştırın
pip install -e .
(noktaya dikkat edin, "geçerli dizin" anlamına gelir)
Ayrıca şunu kullanarak yüklendiğini görebilirsiniz: pip freeze
(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
myproject.
İthalatınıza ekleyin
myproject.
Yalnızca aksi takdirde çalışmayan ithalatlara eklemeniz gerekeceğini unutmayın. Olmadan çalıştı İthalat setup.py
&pip install
çalışacak hala iyi çalışıyor. Aşağıdaki örneğe bakın.
Çözümü test edin
Şimdi, çözümü api.py
yukarıda tanımlananları kullanarak test edelim vetest_one.py
aşağıda tanımlananları .
test_one.py
from myproject.api.api import function_from_api
def test_function():
print(function_from_api())
if __name__ == '__main__':
test_function()
testi çalıştırmak
(venv) PS C:\tmp\test_imports> python .\myproject\tests\test_one.py
I am the return value from api.api!
* Daha ayrıntılı setup.py örnekleri için setuptools belgelerine bakın .
** Gerçekte, sanal ortamınızı sabit diskinizde herhangi bir yere koyabilirsiniz.
sys.path
kesmek geçmiş atlama ve şimdiye kadar (7 yıl sonra!) Gönderilen tek gerçek çözümü okumak öneririz .