Sys.path हैक्स से थक गए?
वहाँ बहुत sys.path.append
सारे उपलब्ध हैं, लेकिन मुझे हाथ में समस्या को हल करने का एक वैकल्पिक तरीका मिला।
सारांश
- कोड को एक फ़ोल्डर में लपेटें (उदाहरण के लिए
packaged_stuff
)
setup.py
स्क्रिप्ट बनाएँ का उपयोग करें जहाँ आप setuptools.setup () का उपयोग करते हैं ।
- पिप पैकेज को संपादन योग्य अवस्था में स्थापित करता है
pip install -e <myproject_folder>
- का उपयोग कर आयात करें
from packaged_stuff.modulename import function_name
सेट अप
प्रारंभिक बिंदु आपके द्वारा प्रदान की गई फ़ाइल संरचना है, जिसे फ़ोल्डर में लपेटा जाता है 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
मैं .
रूट फ़ोल्डर को कॉल करूंगा , और मेरे उदाहरण के मामले में यह स्थित है C:\tmp\test_imports\
।
api.py
परीक्षण के मामले के रूप में, आइए निम्नलिखित का उपयोग करें ।/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 चलाने का प्रयास करें:
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'
इसके अलावा रिश्तेदार आयात की कोशिश कर रहा है:
के प्रयोग from ..api.api import function_from_api
से परिणाम होगा
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
कदम
- मूल स्तर निर्देशिका के लिए एक setup.py फ़ाइल बनाओ
के लिए सामग्री setup.py
होगी *
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
- आभासी वातावरण का उपयोग करें
यदि आप आभासी वातावरण से परिचित हैं, तो एक को सक्रिय करें, और अगले चरण पर जाएं। आभासी वातावरण के उपयोग की बिल्कुल आवश्यकता नहीं है, लेकिन वे वास्तव में लंबे समय में आपकी मदद करेंगे (जब आपके पास 1 से अधिक परियोजना चल रही हो ..)। सबसे बुनियादी चरण हैं (रूट फ़ोल्डर में चलाएँ)
- वर्चुअल एनवी बनाएं
- वर्चुअल एनवी को सक्रिय करें
source ./venv/bin/activate
(लिनक्स, macOS) या ./venv/Scripts/activate
(विन)
इसके बारे में अधिक जानने के लिए, बस Google "python virtual env tutorial" या इससे मिलता-जुलता है। आपको संभवतः किसी भी अन्य कमांड को बनाने, सक्रिय करने और निष्क्रिय करने की आवश्यकता नहीं है।
एक बार जब आप एक आभासी वातावरण बना और सक्रिय कर लेते हैं, तो आपके कंसोल को कोष्ठक में आभासी वातावरण का नाम देना चाहिए
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
और आपका फ़ोल्डर ट्री इस तरह दिखना चाहिए **
.
├── 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]
- पाइप संपादन योग्य अवस्था में अपनी परियोजना स्थापित करें
myproject
का उपयोग कर अपने शीर्ष स्तर पैकेज स्थापित करें pip
। चाल का उपयोग करने के लिए है-e
स्थापित करते समय ध्वज । इस तरह यह एक संपादन योग्य राज्य में स्थापित है, और .py फ़ाइलों के लिए किए गए सभी संपादन स्वचालित रूप से स्थापित पैकेज में शामिल हो जाएंगे।
रूट निर्देशिका में, चलाएँ
pip install -e .
(डॉट नोट करें, यह "वर्तमान निर्देशिका" के लिए है)
आप यह भी देख सकते हैं कि इसका उपयोग करके स्थापित किया गया है 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.
अपने आयात में जोड़ें
ध्यान दें कि आपको myproject.
केवल आयात में जोड़ना होगा जो अन्यथा काम नहीं करेगा। setup.py
& के बिना काम करने वाले आयात pip install
अभी भी ठीक काम करेंगे। नीचे एक उदाहरण देखें।
समाधान का परीक्षण करें
अब, api.py
ऊपर बताए गए, और test_one.py
नीचे परिभाषित का उपयोग करके समाधान का परीक्षण करें।
test_one.py
from myproject.api.api import function_from_api
def test_function():
print(function_from_api())
if __name__ == '__main__':
test_function()
परीक्षण चल रहा है
(venv) PS C:\tmp\test_imports> python .\myproject\tests\test_one.py
I am the return value from api.api!
* सेप्टोलूलस डॉक्स देखें अधिक वर्बोज़ उदाहरणों के लिए ।
** वास्तव में, आप अपने हार्ड डिस्क पर कहीं भी अपना आभासी वातावरण रख सकते हैं।
sys.path
हैक्स को अतीत से हटाने और एकमात्र वास्तविक समाधान पढ़ने की सलाह देता हूं जो इस प्रकार अब तक (7 साल बाद!) पोस्ट किया गया है।