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()
টেস্ট_এন চালানোর চেষ্টা করুন:
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
হবে *
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
- ভার্চুয়াল পরিবেশ ব্যবহার করুন
আপনি যদি ভার্চুয়াল পরিবেশের সাথে পরিচিত হন, একটি সক্রিয় করুন এবং পরবর্তী পদক্ষেপে যান। ভার্চুয়াল পরিবেশের ব্যবহার করা হয় না একেবারে প্রয়োজনীয়, কিন্তু তারা হবে সত্যিই দীর্ঘ রান আপনাকে সাহায্য (আপনি চেয়ে বেশি 1 প্রকল্পের চলমান আছে ..)। সর্বাধিক প্রাথমিক পদক্ষেপগুলি (রুট ফোল্ডারে চালিত)
- ভার্চুয়াল env তৈরি করুন
- ভার্চুয়াল env সক্রিয় করুন
source ./venv/bin/activate
(লিনাক্স, ম্যাকোস) বা ./venv/Scripts/activate
(উইন)
এটি সম্পর্কে আরও জানতে, কেবলমাত্র গুগল "পাইথন ভার্চুয়াল এনভিউ টিউটোরিয়াল" বা এর অনুরূপ out আপনার সম্ভবত কখনও তৈরি করা, সক্রিয়করণ এবং নিষ্ক্রিয় করা ছাড়া অন্য কোনও আদেশের প্রয়োজন নেই।
একবার আপনি ভার্চুয়াল পরিবেশ তৈরি এবং সক্রিয় করার পরে, আপনার কনসোলটি বন্ধনীতে ভার্চুয়াল পরিবেশের নাম দেওয়া উচিত
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 বছর পরে!)।