इंटरप्रेटर में स्थानीय निर्देशिका से अजगर पैकेज आयात करें


86

मैं अपनी स्थानीय निर्देशिका में एक पैकेज विकसित / परीक्षण कर रहा हूं। मैं इसे दुभाषिया (v2.5) में आयात करना चाहता हूं, लेकिन sys.path में वर्तमान निर्देशिका शामिल नहीं है। अभी में टाइप करता हूँ sys.path.insert(0,'.')। क्या कोई बेहतर तरीका है?

इसके अलावा,

from . import mypackage

इस त्रुटि के साथ विफल रहता है:

ValueError: Attempted relative import in non-package

तुमने ऐसा कहां पढ़ा "।" पायथन मॉड्यूल था?
— एस.लॉट

16
@ लोट: यह यहाँ वर्णित एक रिश्तेदार आयात पथ है: docs.python.org/reference/…
— प्रोजेक्ट करें

1
आप इस निश्चित गाइड को देखना चाहते हैं chrisyeh96.github.io/2017/08/08/…
— केविन झू

जवाबों:


44

आप सापेक्ष आयात का उपयोग केवल एक मॉड्यूल से कर सकते हैं जो बदले में पैकेज के हिस्से के रूप में आयात किया गया था - आपकी स्क्रिप्ट या इंटरैक्टिव दुभाषिया नहीं था, इसलिए निश्चित रूप से from . import(जिसका अर्थ है "उसी पैकेज से आयात जो मुझे आयात किया गया था") 'काम है। import mypackageएक बार आप मूल निर्देशिका सुनिश्चित की ठीक हो जाएगा mypackageमें है sys.path(कैसे आप अपने वर्तमान निर्देशिका पाने में कामयाब रहे दूर से sys.pathमैं नहीं जानता कि - आप site.py में कुछ अजीब है, या ऐसा ...)

अपनी वर्तमान निर्देशिका को वापस लाने के लिए sys.pathवास्तव में इसे वहां लगाने से बेहतर कोई तरीका नहीं है।


Ubuntu 8.10 के लिए पायथन 2.5 में दुभाषिया के लिए sys.path में वर्तमान निर्देशिका (खाली स्ट्रिंग) नहीं है। मैंने कुछ भी नहीं बदला, इसलिए इसे किसी तरह से भेज दिया गया। मैंने अभी 3.0 और sys.path में 's' को स्थापित किया है।
— प्रोजेक्टशैव

@projectshave, ओके, उबंटू का कोई संदेह उनके कारणों से नहीं मिला! मैंने ध्यान नहीं दिया कि 8.04 में (वर्तमान में हम काम पर क्या उपयोग करते हैं) लेकिन शायद मैं अभी पर्याप्त ध्यान नहीं दे रहा था।
— एलेक्स मार्टेली

1
मैं आंशिक रूप से गलत हूं। एक शेल से लगाए गए अजगर की वर्तमान निर्देशिका sys.path में है। Emacs से मंगवाए गए पायथन में वर्तमान निर्देशिका नहीं है। अजीब।
— प्रोजेक्टशैव

1
आह ठीक है, तो यह Emacs है, जिन्होंने उबंटू के विरोध के रूप में अपने कारण प्राप्त किए हैं (एक विम उपयोगकर्ता के रूप में मैं वास्तव में नहीं जानता; ;-) आप सशर्त रूप से सम्मिलित कर सकते हैं '।' अपने sys.path में यदि पाठ्यक्रम नहीं है।
— एलेक्स मार्टेली जूल 21'09

@ एलेक्स मार्टेली: बहुत बहुत धन्यवाद! मैं खोज कर रहा हूं और इस समाधान की खोज कर रहा हूं कि मेरे ऐड-ऑन (एनीके लिए) को स्क्रिप्ट के रूप में 'स्थानीय रूप से' चलाने पर एक अलग आयात विवरण की आवश्यकता क्यों है। जब मैंने इसके बजाय एक local_launch () पद्धति को जोड़ा और पैकेज फ़ोल्डर के बाहर एक स्क्रिप्ट से पूरी चीज़ को आयात / लॉन्च किया , तो यह एक आकर्षण की तरह काम किया!
— जॉन कूम्स

17

Sys.path के लिए दस्तावेज़ देखें:

http://docs.python.org/library/sys.html#sys.path

उद्धरण के लिए:

यदि स्क्रिप्ट निर्देशिका उपलब्ध नहीं है (उदाहरण के लिए यदि इंटरप्रेन्योर अंतःक्रियात्मक रूप से लगाया जाता है या यदि स्क्रिप्ट को मानक इनपुट से पढ़ा जाता है), तो पथ [0] खाली स्ट्रिंग है, जो पहले पायथन को वर्तमान निर्देशिका में मॉड्यूल को खोजने का निर्देश देता है।

तो, अगर आप अपने मॉड्यूल युक्त निर्देशिका से अजगर दुभाषिया शुरू कर रहे हैं sys.path के साथ बंदर की जरूरत नहीं है।

इसके अलावा, अपने पैकेज को आयात करने के लिए, बस करें:

import mypackage

चूंकि पैकेज वाली निर्देशिका पहले से ही sys.path में है, इसलिए इसे ठीक काम करना चाहिए।


1
यदि समान फ़ाइल नाम कहीं और काम कर रहा है तो यह विफल हो जाएगा।
— JAR.JAR.beans 12

@ JAR.JAR.beans वर्तमान वर्किंग डाइरेक्टरी में पहली बात यह sys.pathहोनी चाहिए कि वर्किंग एनवायरनमेंट में कहीं और फाइल्स से पहले फाइल मिल जाए।
— स्पूनमाइजर

3
अच्छी बात। यही है, अगर हम फ़ाइल को स्थानीय निर्देशिका से चलाते हैं। मामले में यह कुछ अन्य फ़ोल्डर है, और मामले में sys.path में बदलाव की आवश्यकता है - इसका मतलब sys.path.insert(0, new_path)इसके बजाय है sys.path.append(new_path)।
— JAR.JAR.beans 12

14

यदि आप एक अनमॉडिफाइड पाइथन स्क्रिप्ट को चलाना चाहते हैं तो यह एक विशिष्ट स्थानीय निर्देशिका से पुस्तकालयों को आयात करता है जो आप PYTHONPATHपर्यावरण चर को सेट कर सकते हैं - जैसे बैश में:

export PYTHONPATH=/home/user/my_libs
python myscript.py

यदि आप चाहते हैं कि यह वर्तमान कार्यशील निर्देशिका से आयात करें तो .नोटेशन का उपयोग करें :

export PYTHONPATH=.
python myscript.py

PYTHONPATH के निर्यात में अजगर के बाहर प्रोग्रामिंग शामिल है (जैसे bash में)। इसके अतिरिक्त, docs.python.org/3/use/cmdline.html में स्पष्ट रूप से कहा गया है कि " डिफ़ॉल्ट खोज पथ संस्थापन निर्भर है "।
— इलियास इलियाडिस

13

इसे सरल रखें:

 try:
     from . import mymodule     # "myapp" case
 except:
     import mymodule            # "__main__" case

7
मुझे यह समाधान पसंद है, यह सबसे सरल है। एकमात्र शेष प्रश्न यह है कि आयात लागू करते समय "केवल इसे करने का एक ही तरीका" नियम वैकल्पिक माना गया है ... गंभीर रूप से पैकेजों को घोषित करने और व्यवस्थित करने के लगभग 15 तरीके हैं, जिनमें से सभी कमियां हैं
— लेओ जर्मन

5

इसे काम करने का एक सरल तरीका यह है कि आप अपनी स्क्रिप्ट को पैरेंट डायरेक्टरी से अजगर के -mझंडे, उदाहरण के लिए चलाएं python -m packagename.scriptname। स्पष्ट रूप से इस स्थिति में आपको __init__.pyअपनी निर्देशिका को पैकेज में बदलने के लिए एक फ़ाइल की आवश्यकता होती है ।


5

किसी पैकेज के अंदर अगर setup.py है , तो इसे इंस्टॉल करना बेहतर है

pip install -e .

3

का उपयोग करते हुए sys.pathपहले से ही वर्तमान निर्देशिका को शामिल करना चाहिए।

प्रयत्न:

import .

या:

from . import sth

हालाँकि, यह एक अच्छा अभ्यास नहीं हो सकता है, इसलिए केवल इसका उपयोग क्यों न करें:

import mypackage

5
<आयात mypackage> के साथ समस्या यह है कि यह पैकेज को वैश्विक अजगर env से लोड करेगा, यह स्थानीय फ़ोल्डर से पैकेज / फ़ाइल को लोड कर सकता है, लेकिन यह सिर्फ कुछ अन्य यादृच्छिक mypackge को लोड कर सकता है जो काम कर रहे env में है।
— JAR.JAR.beans 12

2

पार्टी के लिए थोड़ा देर से, लेकिन यह मेरे लिए काम किया है:

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

जाहिर है, अगर कोई खाली स्ट्रिंग है, तो पायथन जानता है कि इसे वर्तमान निर्देशिका में देखना चाहिए। मेरे पास खाली स्ट्रिंग नहीं थी sys.path, जिससे यह त्रुटि हुई।


0

मैं pathlibअपने सिस्टम पथ में अपनी मॉड्यूल निर्देशिका को जोड़ता था क्योंकि मैं पैकेज के रूप में मॉड्यूल को स्थापित करने से बचना चाहता था और @maninthecomputer प्रतिक्रिया ने मेरे लिए काम नहीं किया

import sys
from pathlib import Path

cwd = str(Path(__file__).parent)
sys.path.insert(0, cwd)
from my_module import my_function
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.