मुझे अपना खुद का पायथन मॉड्यूल कहां लगाना चाहिए ताकि इसे आयात किया जा सके


86

अजगर में मेरा अपना पैकेज है और मैं इसे बहुत बार उपयोग कर रहा हूं। सबसे सुंदर या पारंपरिक निर्देशिका क्या है जहाँ मुझे अपना पैकेज डालना चाहिए ताकि यह PYTHONPATH या sys.path के साथ खेले बिना आयात किया जा सके?

उदाहरण के लिए साइट-पैकेज के बारे में क्या? /usr/lib/python2.7/site-packages।
क्या अजगर में पैकेज को कॉपी और पेस्ट करना आम है?


1
एक सेटअप बनाएं जो निर्भरता को बताता है और जो नहीं है और जो उपयोग करता है वह बेहतर अभ्यास है और अधिक पोर्टेबल होगा ... लेकिन हाँ आम तौर पर कॉपी / पेस्ट ठीक काम करेगा ... हालांकि मैं आमतौर पर एक अतिरिक्त फ़ोल्डर बनाता हूं जिसे "उपयोगकर्ता / lib / कहा जाता है "या कुछ और उन सब को वहां रख दिया और बस सुनिश्चित करें कि यह मेरे PYTHONPATH पर है
— जोरन बेज़ले

1
वास्तविक जवाब: मुझे व्यक्तिगत सरल लिपियों / नॉन-डिस्ट्रिब्यूटेड पैकेजों के लिए अन्य उत्तर पसंद नहीं हैं, जैसे @JoranBeasley: अपनी स्क्रिप्ट को (या उनसे लिंक करने के लिए) रखने के लिए कुछ फ़ोल्डर बनाएं, और उस फ़ोल्डर को अपने बैश के भीतर PYTHONPATH में जोड़ें। रनकॉम ट्री (उदाहरण के लिए स्क्रिप्ट / लिंक लगाएं ~/foo/bar/, export PYTHONPATH=~/foo/bar # fields separated by ":"अपनी ~/.bashrcफ़ाइल में जोड़ें )। देखें man python, यह मैनुअल पथ डिफ़ॉल्ट अजगर खोज पथ से पहले है। नाम टकराव से सावधान।

जवाबों:


60

मैं आमतौर पर उस सामान को रखता हूं जिसे मैं उपयोगकर्ता साइट निर्देशिका में आयात करने के लिए तैयार करना चाहता हूं:

~/.local/lib/pythonX.X/site-packages

अपने मंच के लिए सही निर्देशिका दिखाने के लिए, आप उपयोग कर सकते हैं python -m site --user-site


संपादित करें: इसे sys.pathबनाते समय यह दिखाई देगा :

mkdir -p "`python -m site --user-site`"

जब मैं एक टर्मिनल से अजगर को खोलता हूं, तो यही sys.path देता है। ध्यान दें कि कोई स्थानीय ['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7-plat-linux2', '/ usr / usr / है lib64 / python2.7 / lib-tk ',' /usr/lib64/python2.7/lib-old ',' /usr/lib64/python2.7/lib-dynload ',' /usr/lib64/python2.7 / साइट-पैकेज ',' /usr/lib64/python2.7/site-packages/PIL ',' /usr/lib64/python2.7/site-packages/gst-0.10 ',' / usr / lib64 / python2। 7 / साइट-संकुल / gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/site-packages/setuptools.6c11-py2.7.egg
— -इन्फो

एक स्क्रिप्ट निष्पादित करते समय यह वही है जो यह देता है [/ / home / username / Desktop / mypackage / Examples ',' /usr/lib64/python27.zip ',' /usr/lib64/python2.7 ',' / usr / lib64 /python2.7/plat-linux2 ',' /usr/lib64/python2.7/lib-tk ',' /usr/lib64/python2.7/lib-old ',' /usr/lib64/python2.7// lib-dynload ',' /usr/lib64/python2.7/site-packages ',' /usr/lib64/python2.7/site-packages/PIL ',' /sr/lib64/python2.7/site-packages ' /gst-0.10 ',' /usr/lib64/python2.7/site-packages/gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/ साइट-संकुल / सेटपूल-0.6c11-py2.7.egg-info ']
— कोबी

python -m site --user-site /home/username/.local/lib/python2.7/site-packages लेकिन यह sys.path के बीच नहीं है !!
— कोबरा

@Cobry python -m site --user-siteआपको बताएगा कि आपको कौन सी डायरेक्टरी बनानी चाहिए। यह sys.modulesतब तक प्रकट नहीं होगा जब तक आप वास्तव में इसे नहीं बनाते ।
— आया

@mata आप शायद बदलना चाहिए mkdirकरने के लिए mkdir -pमध्यवर्ती निर्देशिका बनाने के लिए। मेरे पास भी नहीं था ~/.local। ;-)
— आया

27

इसलिए अगर आपकी खुद की और आपकी निर्देशिका की नौसिखिया बहुत अच्छी तरह से व्यवस्थित नहीं हैं, तो आप इस तरीके को आजमाना चाहते हैं।

अपने अजगर टर्मिनल को खोलें। एक मॉड्यूल आयात करें जिसे आप जानते हैं कि मेरे मामले में सुन्न के रूप में काम करता है और निम्नलिखित करें। Import numpy

numpy.__file__

जिसके परिणामस्वरूप

'/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages/numpy/__init__.py'

इसका परिणाम numpy.__file__यह है कि आपको numpy/__init__.pyमेरे मॉड्यूल के साथ अजगर फ़ाइल डालनी चाहिए (छोड़कर ) मेरे लिए ऐसा होगा

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages

ऐसा करने के लिए बस अपने टर्मिनल पर जाएं और टाइप करें

mv "location of your module" "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages"

अब आपको अपने मॉड्यूल को आयात करने में सक्षम होना चाहिए।


मेरे पायथन में कैसे आया, "._file_" काम नहीं करता है? >>> आयात फिर से >>> re._file_ Traceback (सबसे हालिया कॉल अंतिम): फ़ाइल "<pyshell # 10>", पंक्ति 1, में <मॉड्यूल> re._file_ AttributeError: मॉड्यूल 'पुनः' कोई विशेषता नहीं है ' फ़ाइल '>
— उर्सो

3
@ क्या आप दो अंडरस्कोर का उपयोग कर रहे हैं? कमान re.__file__ने मेरे लिए काम किया।
— अरी ६४

इस तरह के एक स्वच्छ समाधान के लिए बहुत बहुत धन्यवाद @ arie64। मेरे लिए भी अच्छा काम किया !!
— Bms भारद्वाज

धन्यवाद यह मेरे लिए भी काम किया। लेकिन अजीब तरह से मैं फ़ाइल मॉड्यूल में अपने मॉड्यूल को भेजा निर्देशिका / फ़ोल्डर नहीं ढूँढ सकता। ऐसा लगता है कि फ़ोल्डर मौजूद नहीं है। कोई भी आइडिया क्यों फ़ोल्डर को नहीं दिखाता है कि उसे कहां होना चाहिए? (मैंने "छिपी हुई वस्तुओं को दिखाने में सक्षम है" तो यह बस इतना ही नहीं है ...)
— आंद्रे

7

यह कुछ ऐसा है जो मेरे लिए काम करता है (मुझे अक्सर निजी पैकेज रिपॉजिटरी में अपलोड किए गए अजगर पैकेज बनाने होते हैं)। सवाल पर @joran द्वारा टिप्पणी पर विस्तार से।

  1. पैकेज बनाने के लिए कार्यस्थल के रूप में उपयोग की जाने वाली "बिल्ड निर्देशिका" बनाएं। आपकी पसंद की कोई भी निर्देशिका करेगा
  2. वहाँ अपने अजगर पैकेज की प्रतिलिपि बनाएँ, और एक setup.py फ़ाइल बनाएँ। इसे सही ढंग से setup.py बनाने में मदद करनी चाहिए।
  3. जिस प्रोजेक्ट पर आप काम कर रहे हैं, उसके लिए एक वर्चुअन बनाएं । virtualenvs में अन्य लाभों का एक समूह है, मैं यहां विवरण में नहीं जा रहा हूं।
  4. स्थानीय डिस्ट पैकेज बनाएं python setup.py sdist --format=tar। बनाया गया पैकेज आदर्श रूप से distफ़ोल्डर में होना चाहिए ।
  5. अपने virtualenv पर पैकेज स्थापित करें (इसे सक्रिय करने के बाद)। pip install <yourpackage>.tar

pip install --force-reinstallयदि आप पुस्तकालयों के साथ अधिक खेलने और डिस्टर्ब पैकेज को फिर से बनाने के लिए उपयोग कर सकते हैं ।

मैंने पाया है कि यह तरीका मेरे लिए बहुत अच्छा है। यदि आपको केवल अपने स्थानीय के बजाय अन्य प्रणालियों के उपयोग के लिए मॉड्यूल को पैकेज करने की आवश्यकता नहीं है, तो यह विधि एक ओवरकिल हो सकती है

हैप्पी हैकिंग।


1

मेरे मैक पर, मैंने किया sudo find / -name "site-packages"। यही कारण है कि मेरे जैसे कुछ रास्तों दिया /Library/Python/2.6/site-packages, /Library/Python/2.7/site-packagesऔर /opt/X11/lib/python2.6/site-packages।

तो, मुझे पता था कि अगर मैं v2.7 या v2.6 का उपयोग कर रहा था, तो मुझे अपने मॉड्यूल कहां रखना चाहिए।

आशा करता हूँ की ये काम करेगा।


1

निम्नलिखित स्रोत कोड जोड़कर आयात फ़ोल्डर निकाले जा सकते हैं:

import sys
print sys.path

स्वत: सहिष्णु पीढ़ी उदाहरण होगा:

ln -s \`pip show em | grep "Location"| cut -d " " -f2\` \`python -m site --user-site\`

"एम" के बजाय आप अन्य पैकेज का उपयोग कर सकते हैं जिसे आपने "बस स्थापित किया है लेकिन अजगर इसे नहीं देख सकता है"

नीचे मैं टिप्पणी में अनुरोध किए जा रहे विवरणों के बारे में अधिक बताऊंगा।

मान लें कि आपने निम्नलिखित कमांड के साथ अजगर मॉड्यूल एम या पीसरियल स्थापित किया है (उदाहरण ubuntu के लिए हैं):

sudo pip install pyserial

और आउटपुट इस तरह है:

Collecting pyserial
  Downloading pyserial-3.3-py2.py3-none-any.whl (189kB)
    100% |████████████████████████████████| 194kB 2.3MB/s 
Installing collected packages: pyserial
Successfully installed pyserial-3.3

सवाल निम्नलिखित होगा - अजगर मॉड्यूल pyserial नहीं देख सकता है, क्यों? क्योंकि जिस स्थान पर मॉड्यूल स्थापित किया गया है वह एक अजगर नहीं है जो आपके विशेष उपयोगकर्ता खाते को देख रहा है।

solution - हमें उस पथ से सिम्लिंक बनाना है जहाँ pyserial उस पथ पर पहुँचे जहाँ आपका अजगर खोज रहा है।

सिमलिंक निर्माण आदेश होगा:

ln -s <what_to_link> <where_to_link>

सटीक स्थान टाइप करने के बजाय हम पाइप को यह बताने के लिए कह रहे हैं कि यह कमांड निष्पादित करके मॉड्यूल कहां संग्रहीत करता है:

pip show pyserial | grep "Location"| cut -d " " -f2

सटीक स्थान टाइप करने के बजाय हम अजगर को यह बताने के लिए कह रहे हैं कि यह कमांड निष्पादित करके स्थापित किए जा रहे मॉड्यूल के लिए कहां दिखता है:

python -m site --user-site

दोनों आदेशों को "` "वर्ण से बचाना होगा (आमतौर पर यूएस कीबोर्ड के लिए आपके 1 बटन के बाईं ओर)

परिणाम में निम्नलिखित कमांड ln के लिए प्रदान की जाएगी और गुम सिम्बलिन बनाया जाएगा:

ln -s /usr/local/lib/python2.7/dist-packages /home/<your_username>/.local/lib/python2.7/site-packages 

या अपने डिस्ट्रो और अजगर / पाइप डिफॉल्ट के आधार पर कुछ इसी तरह।


एक शक्तिशाली एक-लाइनर की तरह दिखता है ... क्या आप हमारे लिए लिनक्स न्यूबिक्स के बारे में कुछ समझा सकते हैं? लोग कुछ ऐसा उपयोग करने के लिए सावधान हो सकते हैं जो उन्हें समझ में नहीं आता :-)
— पियानोजैम

-1

यदि आप एक मॉड्यूल विकसित कर रहे हैं तो मैं इसका पालन करने की सलाह दूंगा।

import sys
sys.path.append("/home/mylinux/python-packages")

अब आपके द्वारा रखा गया कोई भी मॉड्यूल python-packagesआयात करने योग्य है Python-interpreter।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.