[python] विभिन्न फ़ोल्डर से फ़ाइलों को आयात करना



Answers

इसके साथ कुछ भी गलत नहीं है:

from application.app.folder.file import func_name

बस सुनिश्चित करें कि फ़ोल्डर में __init__.py भी है, यह इसे पैकेज के रूप में शामिल करने की अनुमति देता है। निश्चित नहीं है कि अन्य जवाब PythonPATH के बारे में क्यों बात करते हैं।

Question

मेरे पास निम्न फ़ोल्डर संरचना है।

application/app/folder/file.py

और मैं file.py से कुछ अन्य पायथन फ़ाइल में आयात करना चाहता हूं जो इसमें रहता है

application/app2/some_folder/some_file.py

मैंने कोशिश की

from application.app.folder.file import func_name

और कुछ अन्य विभिन्न प्रयासों लेकिन अब तक मैं ठीक से आयात करने का प्रबंधन नहीं कर सका। मैं यह कैसे कर सकता हूँ?




यह विंडोज़ पर मेरे लिए काम करता है

# some_file.py on mainApp/app2 
import sys
sys.path.insert(0, sys.path[0]+'\\app2')

import some_file



मेरे मामले में मेरे पास आयात करने के लिए एक कक्षा थी। मेरी फाइल इस तरह दिखती है:

# /opt/path/to/code/log_helper.py
class LogHelper:
    # stuff here

मेरी मुख्य फ़ाइल में मैंने कोड को शामिल किया:

path.append("/opt/path/to/code/")
from log_helper import LogHelper



एक पूर्ण पथ के साथ sys.path.append का उपयोग करना अन्य वातावरण में एप्लिकेशन को स्थानांतरित करते समय आदर्श नहीं है। एक सापेक्ष पथ का उपयोग करना हमेशा काम नहीं करेगा क्योंकि वर्तमान कार्यशील निर्देशिका इस बात पर निर्भर करती है कि स्क्रिप्ट कैसे चलती है।

चूंकि एप्लिकेशन फ़ोल्डर संरचना तय की गई है, इसलिए हम पूर्ण पथ प्राप्त करने के लिए os.path का उपयोग कर सकते हैं। उदाहरण के लिए, यदि यह संरचना है:

/home/me/application/app2/some_folder/vanilla.py
/home/me/application/app2/another_folder/mango.py

और मान लें कि आप "आम" मॉड्यूल आयात करना चाहते हैं। आप vanilla.py में निम्न कार्य कर सकते हैं:

import sys, os.path
mango_dir = (os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
+ '/another_folder/')
sys.path.append(mango_dir)
import mango

बेशक, आपको mango_dir चर की आवश्यकता नहीं है।

यह समझने के लिए कि यह कैसे काम करता है इस इंटरैक्टिव सत्र उदाहरण पर:

>>> import os
>>> mydir = '/home/me/application/app2/some_folder'
>>> newdir = os.path.abspath(os.path.join(mydir, '..'))
>>> newdir
    '/home/me/application/app2'
>>> newdir = os.path.abspath(os.path.join(mydir, '..')) + '/another_folder'
>>> 
>>> newdir
'/home/me/application/app2/another_folder'
>>> 

और os.path दस्तावेज की जांच करें।




अपने पायथन परियोजना के लिए मूल निर्देशिका के रूप में application को ध्यान में रखते हुए, app , app और folder फ़ोल्डरों में एक खाली __init__.py फ़ाइल बनाएं। फिर some_file.py की परिभाषा प्राप्त करने के लिए आपके some_file.py बदलाव करें:

import sys
sys.path.insert(0, r'/from/root/directory/application')

from application.app.folder.file import func_name ## You can also use '*' wildcard to import all the functions in file.py file.
func_name()



मुझे लगता है कि दस्तावेज में वर्णित पर्यावरण चर PYTHONPATH एक साफ तरीका उपयोग करना होगा: Python2 , Python3

export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH
# Windows users: use "set" instead of "export"



मैं काफी खास हूं: मैं विंडोज के साथ पायथन का उपयोग करता हूं!

मैं बस पूरी जानकारी देता हूं: विंडोज और लिनक्स दोनों के लिए, दोनों रिश्तेदार और पूर्ण पथ sys.path में काम करते हैं (मुझे सापेक्ष पथ की आवश्यकता होती है क्योंकि मैं कई पीसी पर और विभिन्न मुख्य निर्देशिकाओं के तहत अपनी स्क्रिप्ट का उपयोग करता हूं)।

और जब विंडोज़ का उपयोग करते समय \ और / फ़ाइल नामों के लिए विभाजक के रूप में उपयोग किया जा सकता है और निश्चित रूप से आपको पायथन स्ट्रिंग में डबल \
कुछ वैध उदाहरण:

sys.path.append('c:\\tools\\mydir')
sys.path.append('..\\mytools')
sys.path.append('c:/tools/mydir')
sys.path.append('../mytools')

(ध्यान दें: मुझे लगता है कि / से अधिक सुविधाजनक है, यदि यह कम 'विंडोज-मूल' है, क्योंकि यह लिनक्स-संगत और विंडोज एक्सप्लोरर को कॉपी करने के लिए आसान है)




आपकी समस्या यह है कि पायथन इस फ़ाइल के लिए पायथन निर्देशिका में देख रहा है और इसे नहीं ढूंढ रहा है। आपको यह निर्दिष्ट करना होगा कि आप उस निर्देशिका के बारे में बात कर रहे हैं जिसमें आप पाइथन एक हैं और नहीं।

ऐसा करने के लिए आप इसे बदल दें:

from application.app.folder.file import func_name

इसके लिए:

from .application.app.folder.file import func_name

डॉट जोड़कर आप कह रहे हैं कि पाइथन निर्देशिका में देखने के बजाय एप्लिकेशन फ़ोल्डर के लिए इस फ़ोल्डर में देखें।






Related