मॉड्यूल के पथ को कैसे पुनः प्राप्त करें?


754

मैं यह पता लगाना चाहता हूं कि क्या मॉड्यूल बदल गया है। अब, inotify का उपयोग करना सरल है, आपको बस उस निर्देशिका को जानना होगा जिसे आप सूचनाएं प्राप्त करना चाहते हैं।

मैं अजगर में एक मॉड्यूल के मार्ग को कैसे पुनः प्राप्त करूं?


1
मॉड्यूलफाइंडर देखें: docs.python.org/library/modulefinder.html

9
यदि आप अभी भी इस साइट को देख रहे हैं, तो कृपया इसका सही उत्तर अपडेट करें । यह प्रस्तावित समाधान की तुलना में स्वच्छ तरीका है और यह उन मामलों में भी काम करता है जहां __file__सेट नहीं किया गया है।
एरिक्बवर्क

3
@ erikb85: यह केवल क्लीनर नहीं है; चुपचाप गलत नाम पैदा करने पर केस का inspectहल भी काम आता है। execfile()__file__
jfs


import pathlib, module; pathlib.Path(module.__file__).resolve().parentयह प्लेटफॉर्म पर
निर्भर है

जवाबों:


904
import a_module
print(a_module.__file__)

वास्तव में आपको .pyc फ़ाइल को पथ देगा जो लोड किया गया था, कम से कम मैक ओएस एक्स पर। तो मुझे लगता है कि आप कर सकते हैं:

import os
path = os.path.abspath(a_module.__file__)

आप भी आजमा सकते हैं:

path = os.path.dirname(a_module.__file__)

मॉड्यूल की निर्देशिका प्राप्त करने के लिए।


54
यह आपके द्वारा आयात किए जाने वाले मॉड्यूल का पथ कैसे प्राप्त करता है, इसका उत्तर देता है, लेकिन आपके द्वारा चलाए जा रहे मॉड्यूल / स्क्रिप्ट का नहीं (आपके द्वारा चलाए जा रहे स्क्रिप्ट के लिए, __file__पूर्ण पथ नहीं है, यह सापेक्ष है)। मैं जिस फ़ाइल में हूं, उसी निर्देशिका से दूसरे मॉड्यूल को आयात करना था और जैसा कि यहां दिखाया गया है। क्या कोई और अधिक सुविधाजनक तरीका जानता है?
बेन ब्रायंट

5
@hbdgaf को यकीन है कि बिल्ट-इनself.__file__
डान पासरो

26
@BenBryant @hbdgaf os.path.dirname(__file__)मेरे लिए ठीक काम करता है और मॉड्यूल की निर्देशिका के एब्स को वापस करता है।
निकोलो

9
मैंने ऐसा करने की कोशिश की और ट्रेसबैक प्राप्त किया: AttributeError: 'module' object has no attribute '__file__'
डोरियन डोर

5
@DorianDore मैं मॉड्यूल के साथ थोड़ा गड़बड़ कर रहा था और एक समाधान के लिए मिला था path = module.__path__.__dict__["_path"][0], लेकिन मुझे यकीन नहीं है कि यह पोर्टेबल है या अगर यह अजगर संस्करणों के बीच भिन्न नहीं है या नहीं। यह मेरे लिए काम कर रहा है, इस जवाब के विपरीत जो मुझे एक ही त्रुटि देता है और inspectजवाब उठता है TypeError: <module 'module' (namespace)> is a built-in module...
Jezor

279

नहीं है inspectअजगर में मॉड्यूल।

आधिकारिक दस्तावेज

निरीक्षण मॉड्यूल जीवित वस्तुओं के बारे में जानकारी प्राप्त करने में मदद करने के लिए कई उपयोगी कार्य प्रदान करता है जैसे मॉड्यूल, कक्षाएं, विधियों, फ़ंक्शन, ट्रेसबैक, फ़्रेम ऑब्जेक्ट और कोड ऑब्जेक्ट। उदाहरण के लिए, यह आपको एक वर्ग की सामग्री की जांच करने में मदद कर सकता है, एक विधि के स्रोत कोड को पुनः प्राप्त कर सकता है, फ़ंक्शन के लिए तर्क सूची को निकाल सकता है और प्रारूपित कर सकता है, या एक विस्तृत ट्रेसबैक प्रदर्शित करने के लिए आवश्यक सभी जानकारी प्राप्त कर सकता है।

उदाहरण:

>>> import os
>>> import inspect
>>> inspect.getfile(os)
'/usr/lib64/python2.7/os.pyc'
>>> inspect.getfile(inspect)
'/usr/lib64/python2.7/inspect.pyc'
>>> os.path.dirname(inspect.getfile(inspect))
'/usr/lib64/python2.7'

7
आप inspectवर्तमान फ़ाइल का नाम प्राप्त करने के लिए भी उपयोग कर सकते हैं ; देखें stackoverflow.com/a/50905/320036
4

5
मैंने इस सवाल को कई बार देखा और यह सबसे उचित जवाब है जो मैंने कभी देखा है! कृपया जानकारी के बारे में अद्यतन करेंinspect.currentframe()
erikbwork

inspect.getfile()दृष्टिकोण मॉड्यूल के साथ काम नहीं करता है _io, लेकिन मॉड्यूल के साथ काम करता है io
smwikipedia

70

जैसा कि अन्य उत्तरों ने कहा है, ऐसा करने का सबसे अच्छा तरीका है __file__(नीचे फिर से प्रदर्शित)। हालाँकि, एक महत्वपूर्ण चेतावनी है, जो यह है कि __file__यदि आप मॉड्यूल को अपने आप (यानी __main__) पर चला रहे हैं तो इसका कोई अस्तित्व नहीं है ।

उदाहरण के लिए, मान लें कि आपके पास दो फ़ाइलें हैं (दोनों आपके PYTHONPATH पर हैं):

#/path1/foo.py
import bar
print(bar.__file__)

तथा

#/path2/bar.py
import os
print(os.getcwd())
print(__file__)

Foo.py चलाने से आउटपुट मिलेगा:

/path1        # "import bar" causes the line "print(os.getcwd())" to run
/path2/bar.py # then "print(__file__)" runs
/path2/bar.py # then the import statement finishes and "print(bar.__file__)" runs

यदि आप अपने दम पर बार-बार चलने का प्रयास करते हैं, तो आपको मिलेगा:

/path2                              # "print(os.getcwd())" still works fine
Traceback (most recent call last):  # but __file__ doesn't exist if bar.py is running as main
  File "/path2/bar.py", line 3, in <module>
    print(__file__)
NameError: name '__file__' is not defined 

उम्मीद है की यह मदद करेगा। प्रस्तुत अन्य समाधानों का परीक्षण करते समय इस चेतावनी ने मुझे बहुत समय और भ्रम में डाल दिया।


5
इस स्थिति में, आप फ़ाइल के स्थान पर sys.argv [0] का उपयोग कर सकते हैं ।
जिमोथी

4
क्या यह एक संस्करण-विशिष्ट चेतावनी है? 2.6 और 2.7 में, मैं सफलतापूर्वक फ़ाइल पर निर्भर करता हूं , जो फ़ाइल का काम करता है जब नाम __ == '__ मुख्य ' होता है। एकमात्र विफलता का मामला जो मैंने देखा है, वह "अजगर-प्रिंट ' फ़ाइल ' है।" मैं जोड़ूंगा कि कभी-कभी फ़ाइल '<stdin>' ​​हो सकती है, जो तब होती है जब IDEs जैसे emacs वर्तमान बफर को निष्पादित करते हैं।
पॉल डू बोइस

1
ध्यान दें कि अग्रणी और अनुगामी "__" अक्षर बोल्ड में एक शब्द रखते हैं, इसलिए पिछली टिप्पणियों को पढ़ते समय ध्यान रखें कि :-P
पॉल डू बोइस

1
@PaDDuBois आप w / back tics को घेर सकते हैं: ` __file__` बन जाता है__file__
fncomp

1
कैसे मिलता है NameError? @Paul डु बोइस: मैं अजगर 2.3-3.4 की कोशिश की है और __file__परिभाषित किया गया है फिर भी मैं पायथन फ़ाइल को चलाने: python a.py, python -ma, ./a.py
jfs

43

मैं इस सवाल पर कुछ बदलावों से निपटने की कोशिश करूंगा:

  1. तथाकथित स्क्रिप्ट का मार्ग खोजना
  2. वर्तमान में निष्पादित स्क्रिप्ट का पथ ढूंढ रहा है
  3. बुलाया स्क्रिप्ट की निर्देशिका ढूँढना

(एसओ पर इनमें से कुछ प्रश्न पूछे गए हैं, लेकिन उन्हें डुप्लिकेट के रूप में बंद कर दिया गया है और यहां पुनर्निर्देशित किया गया है।)

उपयोग करने की कैविट्स __file__

आपके द्वारा आयात किए गए मॉड्यूल के लिए:

import something
something.__file__ 

मॉड्यूल के पूर्ण पथ को वापस करेगा । हालाँकि, फ़ोलोइंग स्क्रिप्ट foo.py को देखते हुए:

#foo.py
print '__file__', __file__

इसे 'python foo.py' के साथ कॉल करने पर 'foo.py' वापस आ जाएगा। यदि आप एक शेबंग जोड़ते हैं:

#!/usr/bin/python 
#foo.py
print '__file__', __file__

और इसे ./foo.py का उपयोग करके कॉल करें, यह वापस आ जाएगा './foo.py'। इसे अलग निर्देशिका से कॉल करना, (जैसे निर्देशिका बार में foo.py डाल), फिर या तो कॉल करना

python bar/foo.py

या शेबबैंग को जोड़ने और फ़ाइल को सीधे निष्पादित करना:

bar/foo.py

'बार / foo.py' ( सापेक्ष पथ) लौटाएगा ।

निर्देशिका ढूँढना

अब निर्देशिका प्राप्त करने के लिए वहाँ से जाना, os.path.dirname(__file__)मुश्किल भी हो सकता है। कम से कम मेरे सिस्टम पर, यह खाली स्ट्रिंग देता है यदि आप इसे उसी निर्देशिका से फाइल के रूप में कहते हैं। पूर्व।

# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)

उत्पादन होगा:

__file__ is: foo.py
os.path.dirname(__file__) is: 

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

# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))

जो कुछ इस तरह का उत्पादन करता है:

os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar

ध्यान दें कि एब्सपैथ () सीमलिंक को हल नहीं करता है। यदि आप ऐसा करना चाहते हैं, तो इसके बजाय realpath () का उपयोग करें। उदाहरण के लिए, निम्न मान के साथ file_import_testing_link को file_import_testing.py की ओर इंगित करते हुए:

import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)

निष्पादित करने से निरपेक्ष मार्ग प्रिंट हो जाएंगे जैसे:

abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py

file_import_testing_link -> file_import_testing.py

निरीक्षण का उपयोग करना

@SummerBreeze निरीक्षण मॉड्यूल का उपयोग करने का उल्लेख करता है ।

यह अच्छी तरह से काम करने लगता है, और आयातित मॉड्यूल के लिए काफी संक्षिप्त है:

import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)

आज्ञाकारी पूर्ण मार्ग देता है। हालाँकि वर्तमान में निष्पादित स्क्रिप्ट का मार्ग खोजने के लिए, मुझे इसका उपयोग करने का तरीका नहीं दिखाई दिया।


1
inspect.getfile (ओएस) कोड से डीई .__ फ़ाइल__ के समान है: डीफ़ गेटाइल (ऑब्जेक्ट): "" वर्क आउट किस स्रोत या संकलित फ़ाइल में एक वस्तु को परिभाषित किया गया था। "" यदि ismodule (ऑब्जेक्ट: if hasattr) (ऑब्जेक्ट, ' फाइल '): रिटर्न ऑब्जेक्ट ।__ file__
idanzalz

4
आप inspect.getfile(inspect.currentframe())वर्तमान में चल रही स्क्रिप्ट का पथ प्राप्त करने के लिए उपयोग कर सकते हैं ।
18

33

मुझे नहीं लगता कि कोई भी इस बारे में बात क्यों नहीं कर रहा है, लेकिन मेरे लिए सबसे सरल समाधान imp.find_module ("modulename") ( यहाँ प्रलेखन ) का उपयोग किया जा रहा है:

import imp
imp.find_module("os")

यह दूसरे स्थान पर पथ के साथ एक टपल देता है:

(<open file '/usr/lib/python2.7/os.py', mode 'U' at 0x7f44528d7540>,
'/usr/lib/python2.7/os.py',
('.py', 'U', 1))

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

संपादित करें :

Python3 में, importlibमॉड्यूल को करना चाहिए:

के डॉक्टर importlib.util.find_spec:

निर्दिष्ट मॉड्यूल के लिए कल्पना लौटें।

पहले, sys.modules यह देखने के लिए जांचा जाता है कि क्या मॉड्यूल पहले से ही आयात किया गया था। यदि ऐसा है, तो sys.modules [नाम]। कल्पना लौटी है। अगर ऐसा होता है कि कोई भी सेट नहीं होता है, तो ValueError को उठाया जाता है। यदि मॉड्यूल sys.modules में नहीं है, तो खोजकर्ताओं को दिए गए 'पथ' के मान के साथ उपयुक्त युक्ति के लिए sys.meta_path की खोज की जाती है। अगर कोई युक्ति नहीं मिली तो किसी को नहीं लौटाया जाता है।

यदि नाम सबमॉड्यूल (एक डॉट होता है) के लिए है, तो मूल मॉड्यूल स्वचालित रूप से आयात किया जाता है।

नाम और पैकेज तर्क importlib.import_module () के समान कार्य करते हैं। दूसरे शब्दों में, सापेक्ष मॉड्यूल नाम (अग्रणी डॉट्स के साथ) काम करते हैं।


2
छोटा सा भूत अजगर 2 (वर्तमान संस्करण 2.7.13) में नहीं है। ३.४ के बाद से अजगर ३ में छोटा है। आयात 3 के बजाय अजगर 3 में इस्तेमाल किया जाएगा। मुझे यह समाधान पसंद है, क्योंकि यह तब भी काम करता है जब वास्तविक आयात विफल हो जाएगा (जैसे कि 32 बिट इंजन के लिए 64 बिट मॉड्यूल)
mdew 7

और वास्तव में अच्छा जब 64 बिट sqlite3 का रास्ता खोजने की कोशिश और आयात विफल रहता है। उत्तम।
राह्विन_

2
importlib.machinery.PathFinder().find_module("os").get_filename()सबसे कम विकल्प imp.find_moduleमैंने पायथन 3 + में पाया है। अगर किसी के उपयोग की तलाश है importlib.util.find_spec
टॉरकेड

यह विधि वास्तविक मॉड्यूल को आयात किए बिना काम करती है, जो महान है क्योंकि मैं इसका उपयोग यह पता लगाने के लिए करता हूं कि किसी साझा कंप्यूटर से किसी मॉड्यूल का कौन सा संस्करण आयात किया जा रहा है।
गौडा

19

यह तुच्छ था।

प्रत्येक मॉड्यूल में एक __file__चर होता है जो अपने रिश्तेदार पथ को दिखाता है जहां से आप अभी हैं।

इसलिए, मॉड्यूल को सूचित करने के लिए एक निर्देशिका प्राप्त करना सरल है:

os.path.dirname(__file__)

14
लगभग नहीं बल्कि बहुत सही - फ़ाइल है नहीं "तुम अभी कहाँ पर हैं के सापेक्ष"; जब यह सापेक्ष होता है (जो कि केवल तब होगा जब sys.path में सापेक्ष पथ होते हैं), यह उस जगह के सापेक्ष होता है जहां आप मॉड्यूल लोड होने पर थे
चार्ल्स डफी

17
import os
path = os.path.abspath(__file__)
dir_path = os.path.dirname(path)

1
मेरे लिनक्स python 2.6 पर काम नहीं करता है क्योंकि __file__अभी अभी dir / test.py है, abspath में pathname को पूरा करने के लिए cwd शामिल है जो वांछित परिणाम नहीं है, लेकिन यदि आप एक मॉड्यूल आयात करते हैं तो m.__file__वांछित परिणाम देता है।
बेन ब्रायंट

10
import module
print module.__path__

संकुल, एक और विशेष गुण का समर्थन __path__। यह एक सूची बनने के लिए आरंभिक है, जिसमें __init__.pyउस फ़ाइल में कोड के निष्पादन से पहले पैकेज रखने वाली निर्देशिका का नाम होता है। इस चर को संशोधित किया जा सकता है; ऐसा करने से पैकेज में निहित मॉड्यूल और उप-पैकेज की भविष्य की खोज प्रभावित होती है।

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

स्रोत


9

कमांड लाइन उपयोगिता

आप इसे कमांड लाइन उपयोगिता में बदल सकते हैं,

python-which <package name>

यहां छवि विवरण दर्ज करें


सृजन करना /usr/local/bin/python-which

#!/usr/bin/env python

import importlib
import os
import sys

args = sys.argv[1:]
if len(args) > 0:
    module = importlib.import_module(args[0])
    print os.path.dirname(module.__file__)

इसे अमल में लाएं

sudo chmod +x /usr/local/bin/python-which

7

इसलिए मैंने py2exe के साथ ऐसा करने में काफी समय बिताया। समस्या स्क्रिप्ट के आधार फ़ोल्डर को प्राप्त करने की थी, चाहे वह पायथन स्क्रिप्ट के रूप में चलाया जा रहा हो या एक py2.exe निष्पादन योग्य के रूप में। यह भी काम करने के लिए कि क्या यह चालू फ़ोल्डर से चलाया जा रहा था, सिस्टम के पथ से एक और फ़ोल्डर या (यह सबसे कठिन था)।

आखिरकार मैंने py2exe में चलने के एक संकेतक के रूप में sys.frozen का उपयोग करते हुए इस दृष्टिकोण का उपयोग किया:

import os,sys
if hasattr(sys,'frozen'): # only when running in py2exe this exists
    base = sys.prefix
else: # otherwise this is a regular python script
    base = os.path.dirname(os.path.realpath(__file__))

7

आप बस अपने मॉड्यूल को आयात कर सकते हैं फिर उसका नाम मार सकते हैं और आपको इसका पूरा रास्ता मिल जाएगा

>>> import os
>>> os
<module 'os' from 'C:\\Users\\Hassan Ashraf\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\os.py'>
>>>

4

यदि आप अपने किसी भी मॉड्यूल से पैकेज के मूल पथ को पुनः प्राप्त करना चाहते हैं, तो निम्न कार्य (पायथन 3.6 पर परीक्षण):

from . import __path__ as ROOT_PATH
print(ROOT_PATH)

इसके बजाय मुख्य __init__.pyपथ का उपयोग करके भी संदर्भित किया जा सकता है __file__

उम्मीद है की यह मदद करेगा!


3

यदि __file__वर्तमान का उपयोग करने का एकमात्र समय है, तो सापेक्ष निर्देशिका रिक्त है (यानी, उसी निर्देशिका से स्क्रिप्ट के रूप में चल रहा है जहां स्क्रिप्ट है), तो एक तुच्छ समाधान है:

import os.path
mydir = os.path.dirname(__file__) or '.'
full  = os.path.abspath(mydir)
print __file__, mydir, full

और परिणाम:

$ python teste.py 
teste.py . /home/user/work/teste

कॉल के or '.'बाद चाल है dirname()। यह dir को सेट करता है ., जिसका अर्थ है वर्तमान निर्देशिका और किसी भी पथ से संबंधित फ़ंक्शन के लिए एक मान्य निर्देशिका है।

इस प्रकार, का उपयोग abspath()करना वास्तव में आवश्यक नहीं है। लेकिन अगर आप इसे वैसे भी उपयोग करते हैं, तो ट्रिक की जरूरत नहीं है: abspath()खाली रास्तों को स्वीकार करता है और इसे वर्तमान निर्देशिका के रूप में ठीक से व्याख्या करता है।


ऑर्डर को बेहतर तरीके से स्वैप करें और बस उपयोग करें os.path.dirname(os.path.abspath(__file__))क्योंकि तब आपको रिश्तेदार रास्तों के बारे में चिंता करने की ज़रूरत नहीं है। कीड़े के लिए एक कम अवसर।
szali

3

मैं एक सामान्य परिदृश्य (पायथन 3 में) के साथ योगदान करना चाहता हूं और इसके लिए कुछ दृष्टिकोण तलाशता हूं।

अंतर्निहित फ़ंक्शन ओपन () या तो अपने पहले तर्क के रूप में सापेक्ष या पूर्ण पथ को स्वीकार करता है। सापेक्ष पथ को वर्तमान कार्यशील निर्देशिका के सापेक्ष माना जाता है, हालांकि फ़ाइल के लिए पूर्ण पथ को पारित करने की सिफारिश की जाती है।

बस कहा जाता है, यदि आप निम्न कोड के साथ एक स्क्रिप्ट फ़ाइल चलाते हैं, तो यह गारंटी नहीं है कि example.txtफ़ाइल उसी निर्देशिका में बनाई जाएगी जहां स्क्रिप्ट फ़ाइल स्थित है:

with open('example.txt', 'w'):
    pass

इस कोड को ठीक करने के लिए हमें स्क्रिप्ट का मार्ग प्राप्त करने और उसे निरपेक्ष बनाने की आवश्यकता है। पथ को निरपेक्ष बनाने के लिए हम बस os.path.realpath () फ़ंक्शन का उपयोग करते हैं । स्क्रिप्ट के लिए रास्ता पाने के लिए कई सामान्य कार्य हैं जो विभिन्न पथ परिणाम लौटाते हैं:

  • os.getcwd()
  • os.path.realpath('example.txt')
  • sys.argv[0]
  • __file__

दोनों कार्य os.getcwd () और os.path.realpath () वर्तमान कार्य निर्देशिका के आधार पर पथ परिणाम लौटाते हैं । आम तौर पर वह नहीं जो हम चाहते हैं। Sys.argv सूची का पहला तत्व रूट स्क्रिप्ट (आपके द्वारा चलाए जाने वाले स्क्रिप्ट) का मार्ग है, भले ही आप सूची को रूट स्क्रिप्ट या इसके किसी भी मॉड्यूल में कहते हों। यह कुछ स्थितियों में काम आ सकता है। __FILE__ चर मॉड्यूल जिसमें से यह कहा गया है की पथ है।


निम्न कोड सही ढंग example.txtसे उसी निर्देशिका में एक फ़ाइल बनाता है जहां स्क्रिप्ट स्थित है:

filedir = os.path.dirname(os.path.realpath(__file__))
filepath = os.path.join(filedir, 'example.txt')

with open(filepath, 'w'):
    pass

3

यदि आप अपनी स्क्रिप्ट से पूर्ण पथ जानना चाहते हैं, तो आप पथ ऑब्जेक्ट का उपयोग कर सकते हैं :

from pathlib import Path

print(Path().absolute())
print(Path().resolve('.'))
print(Path().cwd())

cwd () विधि

वर्तमान निर्देशिका का प्रतिनिधित्व करते हुए एक नया पथ ऑब्जेक्ट लौटाएं (जैसा कि os.getcwd () द्वारा लौटाया गया है)

समाधान () विधि

किसी भी सिम्बल को हल करने के लिए पथ को पूर्ण बनाएं। एक नया पथ ऑब्जेक्ट लौटाया गया है:


1

एक अजगर पैकेज के मॉड्यूल से मुझे एक फ़ाइल का उल्लेख करना पड़ा जो पैकेज के समान निर्देशिका में रहती थी। पूर्व।

some_dir/
  maincli.py
  top_package/
    __init__.py
    level_one_a/
      __init__.py
      my_lib_a.py
      level_two/
        __init__.py
        hello_world.py
    level_one_b/
      __init__.py
      my_lib_b.py

इसलिए ऊपर मुझे my_lib_a.py मॉड्यूल से maincli.py को कॉल करना था, यह जानकर कि top_package और maincli.py एक ही डायरेक्टरी में हैं। यहां बताया गया है कि मुझे maincli.py का रास्ता कैसे मिला:

import sys
import os
import imp


class ConfigurationException(Exception):
    pass


# inside of my_lib_a.py
def get_maincli_path():
    maincli_path = os.path.abspath(imp.find_module('maincli')[1])
    # top_package = __package__.split('.')[0]
    # mod = sys.modules.get(top_package)
    # modfile = mod.__file__
    # pkg_in_dir = os.path.dirname(os.path.dirname(os.path.abspath(modfile)))
    # maincli_path = os.path.join(pkg_in_dir, 'maincli.py')

    if not os.path.exists(maincli_path):
        err_msg = 'This script expects that "maincli.py" be installed to the '\
        'same directory: "{0}"'.format(maincli_path)
        raise ConfigurationException(err_msg)

    return maincli_path

PlasmaBinturong I द्वारा पोस्ट किए जाने के आधार पर मैंने कोड को संशोधित किया।


1

यदि आप इसे "प्रोग्राम" में गतिशील रूप से करना चाहते हैं, तो इस कोड को आज़माएं:
मेरा कहना है कि, आपको मॉड्यूल का सटीक नाम "हार्डकोड" नहीं पता होगा। यह एक सूची से चुना जा सकता है या वर्तमान में __file__ का उपयोग करने के लिए नहीं चल सकता है।

(मुझे पता है, यह पायथन 3 में काम नहीं करेगा)

global modpath
modname = 'os' #This can be any module name on the fly
#Create a file called "modname.py"
f=open("modname.py","w")
f.write("import "+modname+"\n")
f.write("modpath = "+modname+"\n")
f.close()
#Call the file with execfile()
execfile('modname.py')
print modpath
<module 'os' from 'C:\Python27\lib\os.pyc'>

मैंने "वैश्विक" मुद्दे से छुटकारा पाने की कोशिश की, लेकिन ऐसे मामले पाए गए जहां यह काम नहीं करता था, मुझे लगता है कि "निष्पादन ()" पायथन 3 में अनुकरण किया जा सकता है क्योंकि यह एक कार्यक्रम में है, इसे आसानी से एक विधि या मॉड्यूल के लिए रखा जा सकता है पुन: उपयोग।


0

यदि आपने इसे पाइप का उपयोग करके स्थापित किया है, तो "पाइप शो" महान काम करता है ('स्थान')

$ पाइप शो डेट्रॉन 2

Name: detectron2
Version: 0.1
Summary: Detectron2 is FAIR next-generation research platform for object detection and segmentation.
Home-page: https://github.com/facebookresearch/detectron2
Author: FAIR
Author-email: None
License: UNKNOWN
Location: /home/ubuntu/anaconda3/envs/pytorch_p36/lib/python3.6/site-packages
Requires: yacs, tabulate, tqdm, pydot, tensorboard, Pillow, termcolor, future, cloudpickle, matplotlib, fvcore

0

यहाँ एक त्वरित बैश स्क्रिप्ट है अगर यह किसी के लिए उपयोगी है। मैं सिर्फ एक पर्यावरण चर सेट करने में सक्षम होना चाहता हूं ताकि मैं pushdकोड के लिए कर सकूं।

#!/bin/bash
module=${1:?"I need a module name"}

python << EOI
import $module
import os
print os.path.dirname($module.__file__)
EOI

शैल उदाहरण:

[root@sri-4625-0004 ~]# export LXML=$(get_python_path.sh lxml)
[root@sri-4625-0004 ~]# echo $LXML
/usr/lib64/python2.7/site-packages/lxml
[root@sri-4625-0004 ~]#
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.