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


1402

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

application/app/folder/file.py

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

application/app2/some_folder/some_file.py

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

from application.app.folder.file import func_name

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


2
संबंधित: stackoverflow.com/q/43476403/674039
wim

आधिकारिक दस्तावेज पढ़ने से मुझे बहुत मदद मिली! docs.python.org/3/reference/…
राजू एस

जवाबों:


1436

डिफ़ॉल्ट रूप से, आप नहीं कर सकते। फ़ाइल आयात करते समय, पायथन केवल वर्तमान निर्देशिका खोजता है, वह निर्देशिका जो प्रविष्टि-बिंदु स्क्रिप्ट से चल रही है, और sys.pathजिसमें पैकेज स्थापना निर्देशिका जैसे स्थान शामिल हैं (यह वास्तव में इससे थोड़ा अधिक जटिल है, लेकिन यह अधिकांश मामलों को शामिल करता है) ।

हालाँकि, आप पाइथन पथ को रनटाइम में जोड़ सकते हैं:

# some_file.py
import sys
# insert at 1, 0 is the script path (or '' in REPL)
sys.path.insert(1, '/path/to/application/app/folder')

import file

355
sys.path.append('/path/to/application/app/folder')है क्लीनर imo
pseudosudo

386
@pseudosudo: हां, यह है, लेकिन शुरुआत में इसे शामिल करने से यह गारंटी मिलती है कि नामकरण संघर्ष के मामले में दूसरों (यहां तक ​​कि अंतर्निहित लोगों) से पहले रास्ता खोजा जाता है।
कैमरून

8
@kreativitea - sys.patha list, not a deque, और इसे lista dequeऔर back में कनवर्ट करने के लिए मूर्खतापूर्ण रिटर्न देता है ।
ArtOfWarfare

37
यह फ़ोल्डर्स में .py फ़ाइलों को प्रबंधित करने के लिए एक पायथोनिक तरीके के रूप में माना जाता है? मैं सोच रहा हूँ ... यह डिफ़ॉल्ट रूप से समर्थित क्यों नहीं है? यह एक भी निर्देशिका में सभी .py फ़ाइलों को बनाए रखने के लिए समझ में नहीं आता है ..
ofir

49
@ ओफ़िर: नहीं, यह एक अच्छा स्वच्छ पायथोनिक समाधान नहीं है। सामान्य तौर पर, आपको पैकेज (जो निर्देशिका पेड़ों पर आधारित होते हैं) का उपयोग करना चाहिए। यह उत्तर पूछे गए प्रश्न के लिए विशिष्ट था, और किसी कारण से बड़ी संख्या में वृद्धि जारी है।
कैमरन

707

कुछ भी गलत नहीं है:

from application.app.folder.file import func_name

बस यह folderभी सुनिश्चित करें कि इसमें एक भी शामिल है __init__.py, यह इसे एक पैकेज के रूप में शामिल करने की अनुमति देता है। निश्चित नहीं कि दूसरे उत्तर की बात क्यों करें PYTHONPATH


47
क्योंकि यह उन मामलों को कवर नहीं करता है जहां संशोधन PYTHONPATHआवश्यक है। मान लें कि आपके पास समान स्तर पर दो फ़ोल्डर हैं: Aऔर BAए है __init.py__Bभीतर से कुछ आयात करने की कोशिश करें A
msvalkon

32
अंदर क्या है init.pyया __init__.pyफ़ाइल?
लोरेम इप्सम डोलर

47
@Xinyang यह एक खाली फाइल हो सकती है। इसका बहुत अस्तित्व पायथन को एक पैकेज के रूप में निर्देशिका का इलाज करने के लिए कहता है।
जय

9
बेशक यह जवाब मानता है कि applicationऔर appपहले से ही पैकेज हैं (यानी आप पहले से ही __init__.pyउन दोनों में हैं)। जोड़ने के परिणाम के रूप में __init__.pyकरने के लिए भी folder, application.app.folderएक (उप) हो जाता है पैकेज , जिसमें से आप उपयोग कर सकते हैं मॉड्यूल application.app.folder.file , जिसका प्रतीक func_nameअब आयात किया जा सकता
Yibo यांग

29
मैं जो भी कोशिश करता हूं, यह काम नहीं करेगा। मैं एक "भाई" निर्देशिका से आयात करना चाहता हूं, इसलिए एक नीचे एक। सभी में माता-पिता सहित __ init __ है। यह अजगर 3 -स्पर्शी है?
dasWesen

109

जब मॉड्यूल समानांतर स्थानों में होते हैं, जैसा कि प्रश्न में:

application/app2/some_folder/some_file.py
application/app2/another_folder/another_file.py

यह आशुलिपि एक मॉड्यूल को दूसरे के लिए दृश्यमान बनाती है:

import sys
sys.path.append('../')

24
एक चेतावनी के रूप में: यह तब तक काम करता है जब तक कि आयात करने वाली स्क्रिप्ट इसकी निर्देशिका से चलती है। अन्यथा स्क्रिप्ट जो भी अन्य निर्देशिका से चलाया जाता है, उसके मूल निर्देशिका को पथ में जोड़ा जाएगा और आयात विफल हो जाएगा।
कार्ल स्मिथ

14
उससे बचने के लिए, हम फ़ाइल की मूल निर्देशिकाsys.path.append(os.path.dirname(os.path.abspath(__file__)))
राहुल

उसने मेरे लिए काम नहीं किया - मुझे माता-पिता के पास वापस चढ़ने के लिए एक अतिरिक्त dirname जोड़ना पड़ा, ताकि cli/foo.pyकमांड लाइन से चलने में सक्षम होimport cli.bar
RCross

2
@Rahul, आपका समाधान इंटरैक्टिव गोले के लिए काम नहीं करता है
तौबी_परिवर्तनवाद

यदि आप इसे अपने रूट फोल्डर (यानी एप्लीकेशन फोल्डर) से चलाते हैं, तो आप शायद sys.path.append('.')तब ठीक होते हैं जब मॉड्यूल का उपयोग करके आयात करते हैं from app2.some_folder.some_file import your_function। वैकल्पिक रूप python3 -m app2.another_folder.another_fileसे मेरे लिए जो काम करता है वह रूट फ़ोल्डर से चल रहा है।
आदी

68

Name-file.py में सबसे पहले आयात करें

 import sys

दूसरा फ़ोल्डर फ़ोल्डर को name-file.py में भेजें

sys.path.insert(0, '/the/folder/path/name-package/')

तीसरा अपनी उपनिर्देशिका में __ init __.py नामक एक रिक्त फ़ाइल बनाएं (यह पायथन को बताता है कि यह एक पैकेज है)

  • name-file.py
  • नाम-पैकेज
    • __ init __.py
    • name-module.py

चौथा name-file.py में फ़ोल्डर के अंदर मॉड्यूल आयात

from name-package import name-module

5
Name-file.py के ठीक नीचे नाम-फ़ोल्डर होने के साथ, यह sys.path.insert-command के बिना भी काम करना चाहिए । जैसे, उत्तर सवाल छोड़ देता है, अगर यह समाधान तब भी काम करता है जब नाम-फ़ोल्डर एक अनियंत्रित स्थान पर स्थित हो।
बास्टियन

55

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

# Linux & OSX
export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH

# Windows
set PYTHONPATH=C:\path\to\dirWithScripts\;%PYTHONPATH%

रुको, क्या मैं फ़ाइल नाम के साथ अपने स्क्रिप्ट्स को बदल दूंगा?
व्लादिमीर पुतिन

4
नहीं, अपनी .py फ़ाइल के लिए निर्देशिका के पथ के साथ
Ax3l

1
दुर्भाग्य से, यदि आप एनाकोंडा का उपयोग कर रहे हैं, तो यह काम नहीं करेगा, क्योंकि हुड PYTHONPATH के तहत वास्तव में आंतरिक रूप से उपयोग नहीं किया जाता है!
information_interchange

एनाकोंडा में (हाल के) बदलावों के लिए, वर्कफ़्लो और वर्क-अराउंड के लिए टिप्पणियों के लिए इस SO को देखें: stackoverflow.com/questions/17386880/… आम तौर पर आयात डायरियों को हैक करने के बजाय छोटे पैकेज बोलना, बनाना और इंस्टॉल करना।
एक्स

45

यहाँ उत्तरों में स्पष्टता का अभाव है, यह पायथन 3.6 पर परीक्षण किया गया है

इस फ़ोल्डर संरचना के साथ:

main.py
|
---- myfolder/myfile.py

myfile.pyसामग्री कहां है:

def myfunc():
    print('hello')

में आयात विवरण main.pyहै:

from myfolder.myfile import myfunc
myfunc()

और यह हैलो प्रिंट करेगा ।


9
myfolder में init .py (खाली) कॉन्फ़िगरेशन फ़ाइल जोड़ने से मेरे लिए linux (y) पर काम किया
विन्सेन्ट

7
@Vincent तुम्हारा मतलब __init__.pyक्या था ?
मर्गलूम

2
@ मर्ग्लूम वास्तव में
विंसेंट

3
किसी कारण से जोड़ना __init__.pyमेरे लिए काम नहीं करता है। मैं Ubuntu 18 पर Py 3.6.5 का उपयोग कर रहा हूं। यह Pycharm पर काम करता है, लेकिन टर्मिनल से नहीं
Crearo Rotar

9
यह उस सवाल से पूरी तरह से संबंधित नहीं है जो वर्तमान कार्यशील निर्देशिका की तुलना में फ़ाइल ट्री की एक अलग शाखा से फाइल आयात करने के बारे में पूछता है।
अलेक्जेंडर

44

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

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

from application.app.folder.file import func_name

इसके लिए:

from .application.app.folder.file import func_name

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


2
यह मुझे तय है
Phi

32

मैं जो जानता हूं, उस __init__.pyफ़ाइल को सीधे उन फ़ंक्शन के फ़ोल्डर में जोड़ दें, जिन्हें आप आयात करना चाहते हैं, वह काम करेगा।


7
केवल उस स्क्रिप्ट को शामिल करना चाहता है जो अन्य निर्देशिका पहले से ही sys.path में है
Ax3l

2
मैंने sys.path.append(tools_dir)विंडोज पर उपयोग किया है और मुझे एक __init__.py' file in my directory टूल_डिर` जोड़ने की आवश्यकता नहीं है
हेरवे-ग्वारिन

24

पायथन 3.4 और बाद में, आप सीधे स्रोत फ़ाइल से आयात कर सकते हैं (प्रलेखन के लिए लिंक) । यह सबसे सरल समाधान नहीं है, लेकिन मैं पूर्णता के लिए इस उत्तर को शामिल कर रहा हूं।

यहाँ एक उदाहरण है। सबसे पहले, आयात की जाने वाली फ़ाइल, नाम foo.py:

def announce():
    print("Imported!")

कोड जो ऊपर फ़ाइल आयात करता है, प्रलेखन में उदाहरण से काफी प्रेरित है:

import importlib.util

def module_from_file(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

foo = module_from_file("foo", "/path/to/foo.py")

if __name__ == "__main__":
    print(foo)
    print(dir(foo))
    foo.announce()

उत्पादन:

<module 'foo' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!

ध्यान दें कि चर नाम, मॉड्यूल नाम और फ़ाइल नाम का मिलान नहीं होना चाहिए। यह कोड अभी भी काम करता है:

import importlib.util

def module_from_file(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

baz = module_from_file("bar", "/path/to/foo.py")

if __name__ == "__main__":
    print(baz)
    print(dir(baz))
    baz.announce()

उत्पादन:

<module 'bar' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!

प्रोग्रामिक रूप से आयात करने वाले मॉड्यूल को पायथन 3.1 में पेश किया गया था और आपको मॉड्यूल को आयात करने के तरीके पर अधिक नियंत्रण प्रदान करता है। अधिक जानकारी के लिए दस्तावेज़ देखें।


11
मुझे नहीं पता कि किसी ने भी इसे समझने की कोशिश की, लेकिन मुझे लगता है कि यह बहुत जटिल है।
दान

23

Linux पर python3 में मेरे लिए काम किया

import sys  
sys.path.append(pathToFolderContainingScripts)  
from scriptName import functionName #scriptName without .py extension  

6
sys.path.append("/home/linux/folder/")- सुनिश्चित करें कि एक शॉर्टकट का उपयोग न करें जैसे"~/folder/"
daGo

22

पायथन के सापेक्ष आयात का प्रयास करें:

from ...app.folder.file import func_name

हर अग्रणी डॉट मौजूदा निर्देशिका के साथ पदानुक्रम शुरुआत में एक और उच्च स्तर है।


समस्या? यदि यह आपके लिए काम नहीं कर रहा है, तो संभवतः आपको कई गोचा के सापेक्ष आयातों से बिट मिल रहा है। अधिक विवरणों के लिए उत्तर और टिप्पणियां पढ़ें: __init__.py के साथ भी "गैर-पैकेज में" संबंधित आयात को कैसे ठीक किया जाए?

संकेत: __init__.pyहर निर्देशिका स्तर पर है। आपको python -m application.app2.some_folder.some_fileशीर्ष स्तर की निर्देशिका से (जो बंद हो जाता है) को चलाने की आवश्यकता हो सकती है या आपके PYTHONPATH में शीर्ष स्तर की निर्देशिका हो सकती है। ओह!


22

मुझे एक ही चुनौती का सामना करना पड़ा, खासकर जब कई फाइलों का आयात किया जाता है, तो यह है कि मैंने इसे कैसे पार किया।

import os, sys

from os.path import dirname, join, abspath
sys.path.insert(0, abspath(join(dirname(__file__), '..')))

from root_folder import file_name

2
यदि आप यह बता सकते हैं कि यह एक सामान्य आयात से अलग ढंग से क्या करता है तो आप अधिक उपयोगी होंगे?
Not2qubit

1
मेरे पास /path/dir1/__init__.py और /path/dir1/mod.py था। Dir1.mod आयात func से /path/some.py के लिए काम किया। जब /path/dir2/some.py में यह केवल तब काम करता था जब मैं कॉपी करता था और फ़ाइल के शीर्ष पर उपरोक्त उत्तर चिपकाता था। मेरे पथ को संपादित नहीं करना चाहता था क्योंकि मेरे पास हर अजगर परियोजना / पथ / में नहीं है।
ज्वाल

19

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

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()

होना चाहिए: sys.path.insert (0, r '/ from / root / निर्देशिका')
बोलाका

18

एप्लिकेशन को अन्य वातावरणों में ले जाते समय निरपेक्ष पथ के साथ 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

बेशक, आप आम चर की जरूरत नहीं है।

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

>>> 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 प्रलेखन की जाँच करें ।


13

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

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

import some_file

10

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

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

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

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

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


4
os.path.join ('उपकरण', 'मिदिर')
कोरी गोल्डबर्ग

7

यदि किसी विशिष्ट पथ से मॉड्यूल लोड करने का उद्देश्य कस्टम मॉड्यूल के विकास के दौरान आपकी सहायता करना है, तो आप परीक्षण स्क्रिप्ट के उसी फ़ोल्डर में एक प्रतीकात्मक लिंक बना सकते हैं जो कस्टम मॉड्यूल की जड़ को इंगित करता है। यह मॉड्यूल संदर्भ उस फ़ोल्डर में चलने वाली किसी भी स्क्रिप्ट के लिए एक ही नाम से स्थापित किसी भी अन्य मॉड्यूल पर वरीयता लेगा।

मैंने इसे लिनक्स पर परीक्षण किया है लेकिन इसे किसी भी आधुनिक ओएस में काम करना चाहिए जो प्रतीकात्मक लिंक का समर्थन करता है।

इस दृष्टिकोण का एक फायदा यह है कि आप एक मॉड्यूल को इंगित कर सकते हैं जो कि आपकी अपनी स्थानीय एसवीसी शाखा में काम करने वाली कॉपी में बैठा हो, जो विकास चक्र के समय को सरल बना सके और मॉड्यूल के विभिन्न संस्करणों के प्रबंधन की विफलता के तरीकों को कम कर सके।


7

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

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

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

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

1
@ not2qubit sys उत्तर में आयात नहीं किया गया था।
वाल्टर

6

मैं एक ही सवाल पर कई बार टकराया, इसलिए मैं अपना समाधान साझा करना चाहूंगा।

पायथन संस्करण: 3.X

निम्नलिखित समाधान किसी ऐसे व्यक्ति के लिए है जो आपके आवेदन को पायथन संस्करण 3.X में विकसित करता है क्योंकि पायथन 2 जनवरी / 1/2020 के बाद से समर्थित नहीं है

प्रोजेक्ट संरचना

पायथन 3 में, आपको इम्प्लिमेंट नेमस्पेस पैकेज के__init__.py कारण अपने प्रोजेक्ट उपनिर्देशिका की आवश्यकता नहीं है । देखें Is init .py अजगर में संकुल के लिए आवश्यक नहीं 3.3+

Project 
├── main.py
├── .gitignore
|
├── a
|   └── file_a.py
|
└── b
    └── file_b.py

समस्या का विवरण

में file_b.py, मैं एक वर्ग आयात करना चाहते हैं Aमें file_a.pyनीचे फ़ोल्डर एक।

समाधान

# 1 एक त्वरित लेकिन गंदा तरीका

पैकेज को स्थापित किए बिना जैसे आप वर्तमान में एक नई परियोजना विकसित कर रहे हैं

try catchत्रुटियों की जाँच करने के लिए उपयोग करना । कोड उदाहरण:

import sys
try:
    # The insertion index should be 1 because index 0 is this file
    sys.path.insert(1, '/absolute/path/to/folder/a')  # the type of path is string
    # because the system path already have the absolute path to folder a
    # so it can recognize file_a.py while searching 
    from file_a import A
except (ModuleNotFoundError, ImportError) as e:
    print("{} fileure".format(type(e)))
else:
    print("Import succeeded")

# 2 अपना पैकेज स्थापित करें

एक बार जब आप अपना एप्लिकेशन इंस्टॉल कर लेते हैं (इस पोस्ट में, इंस्टॉलेशन का ट्यूटोरियल शामिल नहीं है)

आप बस कर सकते हैं

try:
    from __future__ import absolute_import
    # now it can reach class A of file_a.py in folder a 
    # by relative import
    from ..a.file_a import A  
except (ModuleNotFoundError, ImportError) as e:
    print("{} fileure".format(type(e)))
else:
    print("Import succeeded")

हैप्पी कोडिंग!



3

मैं aउस परियोजना पर काम कर रहा था जिसे मैं pip install aनिम्नलिखित फ़ाइल सूची के माध्यम से स्थापित करना चाहता था :

.
├── setup.py
├── MANIFEST.in
└── a
    ├── __init__.py
    ├── a.py
    └── b
        ├── __init__.py
        └── b.py

setup.py

from setuptools import setup

setup (
  name='a',
  version='0.0.1',
  packages=['a'],
  package_data={
    'a': ['b/*'],
  },
)

MANIFEST.in

recursive-include b *.*

a / init .py

from __future__ import absolute_import

from a.a import cats
import a.b

एक / a.py

cats = 0

a / b / init .py

from __future__ import absolute_import

from a.b.b import dogs

a / b / b.py

dogs = 1

मैंने निम्न निर्देशिका से निम्नलिखित को चलाकर मॉड्यूल स्थापित किया है MANIFEST.in:

python setup.py install

फिर, मेरे फाइल सिस्टम पर एक बिल्कुल अलग स्थान से /moustache/armwrestleमैं चलाने में सक्षम था:

import a
dir(a)

जिसने पुष्टि की कि a.catsवास्तव में 0 के बराबर है और a.b.dogsवास्तव में 1 के बराबर है, जैसा कि इरादा था।


2

केवल ऐसा करने के बजाय import ..., यह करें:

from <MySubFolder> import <MyFile>

MyFile MySubFolder के अंदर है।


1

आप f5 दबाकर पायथन शेल को रिफ्रेश कर सकते हैं, या Run-> Run Module में जा सकते हैं। इस तरह आपको फ़ाइल से कुछ पढ़ने के लिए निर्देशिका को बदलना नहीं है। पायथन स्वचालित रूप से निर्देशिका को बदल देगा। लेकिन अगर आप पाइथन शेल में अलग-अलग डायरेक्टरी की अलग-अलग फाइलों के साथ काम करना चाहते हैं, तो आप डायरेक्शन को sys में बदल सकते हैं, जैसा कि कैमरन ने पहले कहा था।


1

इसलिए मैंने अपनी आईडीई पर सिर्फ राइट क्लिक किया था, और एक नया जोड़ा folderऔर सोच रहा था कि मैं इससे आयात करने में सक्षम क्यों नहीं था। बाद में मुझे महसूस हुआ कि मुझे पायथन पैकेज को राइट क्लिक करना और बनाना है, न कि क्लासिक फाइल सिस्टम फोल्डर। या एक पोस्टमार्टम विधि __init__.pyजो अन्य उत्तरों में उल्लिखित है, एक (जो कि अजगर को फाइल सिस्टम फ़ोल्डर को पैकेज के रूप में मानता है) जोड़ रहा है। इस उत्तर को यहाँ जोड़ते हुए कि कोई इस मार्ग से गया है।


1

आप इंपोर्ट्लीब का उपयोग इंपोर्ट मॉड्यूल के लिए कर सकते हैं, जहां आप किसी स्ट्रिंग से किसी फ़ोल्डर का मॉड्यूल आयात करना चाहते हैं जैसे:

import importlib

scriptName = 'Snake'

script = importlib.import_module('Scripts\\.%s' % scriptName)

इस उदाहरण में एक मेनडोम है जो उपरोक्त कोड है, फिर स्क्रिप्स नामक एक फ़ोल्डर और फिर आप scriptNameचर को बदलकर इस फ़ोल्डर से जो कुछ भी चाहते हैं उसे कॉल कर सकते हैं । फिर आप scriptइस मॉड्यूल के संदर्भ में उपयोग कर सकते हैं । जैसे कि अगर मेरे पास Hello()स्नेक मॉड्यूल में कोई फ़ंक्शन है , तो आप ऐसा करके इस फ़ंक्शन को चला सकते हैं:

script.Hello()

मैंने इसका परीक्षण पायथन 3.6 में किया है


0

मैं कई बार इन समस्याओं का सामना कर चुका हूं। मैं इसी पृष्ठ पर बहुत आया हूँ। अपनी अंतिम समस्या में मुझे serverएक निश्चित निर्देशिका से भागना था , लेकिन जब भी डिबगिंग मैं अलग-अलग उप-निर्देशिकाओं से चलाना चाहता था।

import sys
sys.insert(1, /path) 

मेरे लिए काम नहीं किया क्योंकि अलग-अलग मॉड्यूल पर मुझे अलग-अलग * .csv पढ़ना पड़ता था फाइलें थीं जो सभी एक ही डायरेक्टरी में थीं।

अंत में, मेरे लिए जो काम किया वह अजगर नहीं था, मुझे लगता है, लेकिन:

मैं उस मॉड्यूल के शीर्ष पर उपयोग करता हूं if __main__ जिसे मैं डिबग करना चाहता था , जो कि सामान्य पथ से भिन्न से चलाया जाता है।

इसलिए:

# On top of the module, instead of on the bottom
import os
if __name__ == '__main__':
    os.chdir('/path/for/the/regularly/run/directory')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.