2012-04-15 16 views
44

मेरे पास एक मॉड्यूल foo है, जिसमें ut.py और bar.py शामिल है।आयात पाइथन मॉड्यूल पथ पर नहीं

मैं इसे आईडीएलई या पायथन सत्र में आयात करना चाहता हूं। यह कैसे करना है?

मुझे वर्तमान निर्देशिका या डिफ़ॉल्ट पायथन पथ में नहीं मॉड्यूल आयात करने के तरीके पर कोई दस्तावेज़ीकरण नहीं मिल सका। import "<full path>/foo/util.py", और from "<full path>" import util

निकटतम

की कोशिश के बाद मैं था मिल सकता है

import imp 
imp.load_source('foo.util','C:/.../dir/dir2/foo') 

कौन सा मुझे खिड़कियों पर इनकार कर दिया की अनुमति दे दी 7.

+0

इस [संबंधित प्रश्न] को जांचने के लायक भी है (http://stackoverflow.com/questions/15109548/set-pythonpath-before-import-statements)। विशेष रूप से, मुझे 'शीर्ष उत्तर] (http://stackoverflow.com/a/15109660/95852) पसंद है,' sys.path' में परिवर्तन की सुरक्षा के बारे में इसकी स्पष्टता के लिए। –

+0

संभावित डुप्लिकेट [पूर्ण पथ दिए गए मॉड्यूल को कैसे आयात करें?] (Http://stackoverflow.com/questions/67631/how-to-import-a- मॉड्यूल-given-the-full-path) –

उत्तर

62

एक तरह से बस में संशोधन करने के लिए अपने path है। यदि आप sys.path को संशोधित नहीं करना चाहते हैं, तो आप also modify the PYTHONPATH environment variable या install the module on your system कर सकते हैं। सावधान रहें कि इसका मतलब है कि उस निर्देशिका में अन्य निर्देशिकाएं या .py फ़ाइलें अनजाने में लोड की जा सकती हैं।

इसलिए, आप इसके बजाय imp.load_source का उपयोग करना चाह सकते हैं। यह फ़ाइल नाम, नहीं (एक फ़ाइल जो वर्तमान उपयोगकर्ता को पढ़ने के लिए अनुमति दी है करने के लिए) एक निर्देशिका की जरूरत है:

import imp 
util = imp.load_source('util', 'C:/full/path/foo/util.py') 
+0

यह काम करता है, लेकिन अब विधि का उपयोग करके util.method का उपयोग करने का प्रयास करते समय, यह 'विधि' परिभाषित नहीं करता है। लेकिन मैं इसका इस्तेमाल ut.method द्वारा कर सकता हूं। क्यूं कर? – Vort3x

+2

क्योंकि आपने 'method' को परिभाषित नहीं किया है, केवल 'उपयोग'' में 'विधि' 'है। यदि आप चाहें तो 'method = util.method' को परिभाषित कर सकते हैं। – katrielalex

+0

ध्यान दें कि 'foo import * से खराब कोडिंग है जब तक कि आप केवल खोल में घूम रहे हों। – katrielalex

5

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

Module Search Path python.org पर दस्तावेज़ देखें।

import sys 
sys.path.append('C:/full/path') 
from foo import util,bar 

ध्यान दें कि यह एक अजगर पैकेज हो सकता है, अर्थात एक __init__.py फ़ाइल foo की आवश्यकता है:

2

दें कि यह एक कोशिश

import sys 
sys.path.append('c:/.../dir/dir2') 
import foo 
+1

-1 क्योंकि पाइथन पथ में शामिल होना एक खराब समाधान है। यह काम करता है, लेकिन यह imp.load_source से सख्ती से भी बदतर है क्योंकि उपयोगकर्ता किसी भी सिस्टम पथ को संशोधित नहीं करना चाहता है, या कंप्यूटर पर काम कर रहा है जहां वह ऐसा नहीं कर सकती है। यह वास्तव में पायथन में सबसे कष्टप्रद "विशेषताओं" में से एक है, जो अन्यथा एक सुरुचिपूर्ण भाषा है। यह मूर्खतापूर्ण है कि आप किसी अन्य .py फ़ाइल के पथ को नाम देने वाली एक स्ट्रिंग आयात नहीं कर सकते हैं।और यह देखते हुए कि आप नहीं कर सकते हैं, आईपी का उपयोग करके सिस्टम पथ बदलने के खिलाफ सुरक्षा सख्ती से बेहतर है। – ely

+1

@EMS आह .. मैं देख रहा हूं कि आप क्या कह रहे हैं, मुझे पहले इसका एहसास नहीं हुआ था, लेकिन अब आप जो मुद्दा बनाते हैं वह स्पष्ट है। इस पर ध्यान दिलाने के लिए धन्यवाद। (मुझे अब अपने कुछ कोड को संशोधित करना पड़ सकता है :) – Levon

+3

चिंता न करें। यह 'sys.path' (या कम से कम * एक * इच्छित उपयोग केस) का उद्देश्य है। श्री एफ (जो स्पष्ट रूप से पहले ईएमएस थे) गलत है। जैसा कि फिहाग ने अपने उत्तर पर समान -1 टिप्पणी के जवाब में नोट किया है, 'sys.path' * संपूर्ण सिस्टम पथ से संबंधित नहीं है। –

1

phihag के टिप के बाद, मैं इस समाधान है। बस स्रोत फ़ाइल का पथ load_src पर दें और यह इसे लोड करेगा। आपको एक नाम भी प्रदान करना होगा, ताकि आप इस नाम का उपयोग करके इस मॉड्यूल को आयात कर सकें। मैं इसे इस तरह से करना पसंद है क्योंकि यह अधिक स्पष्ट है:

def load_src(name, fpath): 
    import os, imp 
    return imp.load_source(name, os.path.join(os.path.dirname(__file__), fpath)) 

load_src("util", "../util.py") 
import util 

print util.method() 

एक और (कम स्पष्ट) जिस तरह से यह है:

util = load_src("util", "../util.py") # "import util" is implied here 

print util.method() # works, util was imported by the previous line 

संपादित करें: विधि यह स्पष्ट करने के फिर से लिखा गया है।

संबंधित मुद्दे