কিভাবে একটি মডিউল পথ পুনরুদ্ধার?


754

আমি সনাক্ত করতে চাই মডিউলটি পরিবর্তন হয়েছে কিনা। এখন, ইনোটাইফাই ব্যবহার করা সহজ, আপনার কেবল ডিরেক্টরিটি বিজ্ঞপ্তি পেতে চান তা জানতে হবে।

অজগরটিতে আমি কীভাবে একটি মডিউলটির পথ পুনরুদ্ধার করব?


1
মডিউলফাইন্ডারটি দেখুন: docs.python.org/library/modulefinder.html

9
আপনি এখনও এই সাইটে খুঁজছি হয়, তাহলে দয়া করে সঠিক উত্তর আপডেট এই । এটি প্রস্তাবিত সমাধানের তুলনায় বেশ পরিষ্কার এবং এটি __file__সেট না করা ক্ষেত্রেও কাজ করে।
এরিকবওয়ার্ক

3
@ এরিকবি 85: এটি কেবল পরিষ্কার নয়; inspect-ভিত্তিক সমাধানটি execfile()ক্ষেত্রে ক্ষেত্রেও কাজ __file__করে যখন নীরবে ভুল নাম উত্পন্ন করে।
jfs


import pathlib, module; pathlib.Path(module.__file__).resolve().parentএটি প্ল্যাটফর্ম
নির্ভরতা

উত্তর:


903
import a_module
print(a_module.__file__)

কমপক্ষে ম্যাক ওএস এক্সে, লোড হওয়া .pyc ফাইলটি আপনাকে আসলে পথ দেবে So সুতরাং আমি অনুমান করি আপনি এটি করতে পারেন:

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

আপনিও চেষ্টা করতে পারেন:

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

মডিউল ডিরেক্টরি পেতে।


54
এটি আপনার আমদানি করা মডিউলটির পথ কীভাবে পেতে পারে তার উত্তর দেয়, তবে আপনি যে মডিউল / স্ক্রিপ্টে রয়েছেন তা নয় (আপনি যে স্ক্রিপ্টটি চালাচ্ছেন, __file__এটি পুরো পথ নয়, এটি আপেক্ষিক)। আমি যে ফাইলটিতে রয়েছি তার জন্য আমাকে একই ডিরেক্টরি থেকে অন্য একটি মডিউল আমদানি করতে হয়েছিল এবং এখানে প্রদর্শিত হিসাবে করা উচিত। কেউ কি আরও সুবিধাজনক উপায় জানেন?
বেন ব্রায়ান্ট

5
@ এইচবিডিগাফ খুব নিশ্চিত যে কোনও বিল্ট-ইন-এর মতো কোনও জিনিস নেইself.__file__
ড্যান পাসারো

26
@ বেনব্রায়ান্ট @ hbdgaf os.path.dirname(__file__)আমার পক্ষে ভাল কাজ করে এবং মডিউলটির ডিরেক্টরিতে ফিরে আসে।
নিকলিকা

9
আমি এটি করার চেষ্টা করেছি এবং ট্রেসব্যাকটি পেয়েছি: AttributeError: 'module' object has no attribute '__file__'
ডোরিয়ান ডোর

5
@ ডরিয়ানডোর আমি মডিউলগুলি নিয়ে কিছুটা ঝামেলা করছিলাম এবং একটি সমাধান পেয়েছিলাম path = module.__path__.__dict__["_path"][0]তবে আমি নিশ্চিত নই যে এটি পোর্টেবল কিনা বা এটি পাইথনের সংস্করণগুলির মধ্যে পৃথক নাও হয়। এটি আমার পক্ষে কাজ করছে, এই উত্তরটির বিপরীতে যা আমাকে একই ত্রুটি দেয় এবং inspectউত্তর উত্থাপন করে TypeError: <module 'module' (namespace)> is a built-in module...
Jejor

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
z0r

5
আমি এই প্রশ্নটি বহুবার গুগল করেছিলাম এবং এটি এখন পর্যন্ত দেখা সবচেয়ে যুক্তিসঙ্গত উত্তর! দয়া করে সম্পর্কিত তথ্য আপডেট করুনinspect.currentframe()
এরিকবওয়ার্ক

inspect.getfile()পদ্ধতির মডিউল সাথে কাজ করে না _io, কিন্তু মডিউল সঙ্গে কাজ করে io
স্মিভিকিপিডিয়া

70

অন্য উত্তরগুলি যেমন বলেছে, এটি করার সর্বোত্তম উপায় হ'ল __file__(নীচে আবার প্রদর্শিত হবে)। যাইহোক, একটি গুরুত্বপূর্ণ সাবধানবাণী রয়েছে যা __file__আপনি যদি মডিউলটি নিজের (যেমন __main__) চালাচ্ছেন তবে তা বিদ্যমান নেই ।

উদাহরণস্বরূপ, বলুন যে আপনার কাছে দুটি ফাইল রয়েছে (যা উভয়ই আপনার পাইথনপথে রয়েছে):

#/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
এটি কি কোনও সংস্করণ-নির্দিষ্ট ক্যাভিয়েট? ২.6 এবং ২.7 এ, আমি সাফল্যের সাথে ফাইলের উপর নির্ভর করি , যা __ == '__ প্রধান ' নাম হিসাবে ফাইলটি কাজ করে । "পাইথন-সি 'প্রিন্ট ফাইল " " দিয়ে আমি কেবলমাত্র ব্যর্থতার ঘটনাটি দেখেছি । আমি যুক্ত করব যে কখনও কখনও ফাইলটি '<stdin>' ​​হতে পারে যা ইমাক্সের মতো আইডিইগুলি বর্তমান বাফার সম্পাদন করে happens
পল ডু বোইস

1
নোট করুন যে শীর্ষস্থানীয় এবং অনুসরণীয় "__" অক্ষরগুলি একটি শব্দকে সাহসী করে তোলে, তাই পূর্ববর্তী মন্তব্যগুলি পড়ার সময় এটি মনে রাখবেন :
পল ডু বোইস

1
@ পলডুবুইস আপনি চারপাশে ডাব্লু / পিছনের কৌশলগুলি ঘিরে রাখতে পারেন: ` __file__` হয়ে যায়__file__
fncomp

1
আপনি কিভাবে পাবেন NameError? @Paul Du Bois: আমি পাইথন 2.3-3.4 চেষ্টা করেছি এবং __file__সংজ্ঞায়িত করা হয় তবে আমি পাইথন ফাইলটি রান: python a.py, python -ma, ./a.py
jfs

43

আমি এই প্রশ্নে কয়েকটি ভিন্নতাও সামলানোর চেষ্টা করব:

  1. ডাকা স্ক্রিপ্টের পথ সন্ধান করা
  2. বর্তমানে সম্পাদনকারী স্ক্রিপ্টের পথ সন্ধান করছে
  3. বলা স্ক্রিপ্ট ডিরেক্টরি খুঁজে

(এইগুলির কয়েকটি প্রশ্ন এসও-তে জিজ্ঞাসা করা হয়েছিল, তবে নকল হিসাবে বন্ধ করে এখানে পুনর্নির্দেশ করা হয়েছে))

ব্যবহারের গুহা __file__

আপনি যে মডিউলটি আমদানি করেছেন তার জন্য:

import something
something.__file__ 

মডিউলটির পরম পথটি ফিরিয়ে দেবে । যাইহোক, fol.G স্ক্রিপ্ট foo.py দেওয়া:

#foo.py
print '__file__', __file__

এটিকে 'পাইথন 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

নোট করুন যে অ্যাবস্পাথ () সিমলিংকগুলি সমাধান করে না। আপনি যদি এটি করতে চান তবে এর পরিবর্তে রিয়েলপথ () ব্যবহার করুন। উদাহরণস্বরূপ, নিম্নলিখিত বিষয়বস্তু সহ ফাইল_ইম্পোর্ট_স্টেস্টিং.পিতে পয়েন্ট করে একটি সিমলিংক ফাইল_ইম্পোর্ট_টেষ্টিং_লিঙ্ক তৈরি করা:

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

পরিদর্শন ব্যবহার

@ সুমারব্রিজ পরিদর্শন মডিউলটি ব্যবহার করে উল্লেখ করেছেন ।

এটি আমদানি করা মডিউলগুলির জন্য ভালভাবে কাজ করে এবং বেশ সংক্ষিপ্ত বলে মনে হচ্ছে:

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

আনুগত্যের সাথে পরম পথে ফিরে আসে। তবে বর্তমানে সম্পাদনকারী স্ক্রিপ্টের পথ সন্ধান করার জন্য, আমি এটি ব্যবহার করার কোনও উপায় দেখিনি।


1
inspect.getfile (os) ওএস .__ ফাইল__ এর কোড থেকে কোড: Def getfile (অবজেক্ট): "" "কোন উত্স বা সংকলিত ফাইলের মধ্যে কোন বস্তুর সংজ্ঞা দেওয়া হয়েছিল তা কাজ করে" "" যদি ismodule (অবজেক্ট): যদি hasattr (অবজেক্ট, ' ফাইল '): রিটার্ন অবজেক্ট .__ ফাইল__
ইডানজালজ

4
আপনি inspect.getfile(inspect.currentframe())বর্তমানে চলমান স্ক্রিপ্টের পথটি পেতে ব্যবহার করতে পারেন ।
jbochi

33

কেউ কেন এটি সম্পর্কে কথা বলছে না তা আমি পাই না, তবে আমার কাছে সবচেয়ে সহজ সমাধানটি imp.find_module ("মডিউলনাম") ( এখানে ডকুমেন্টেশন ) ব্যবহার করছে:

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

"পরিদর্শন করুন" এর মাধ্যমে এই পদ্ধতির সুবিধা হ'ল মডিউলটি কাজ করতে আপনাকে আমদানি করতে হবে না এবং আপনি ইনপুটটিতে একটি স্ট্রিং ব্যবহার করতে পারেন। উদাহরণস্বরূপ অন্য স্ক্রিপ্টে ডাকা মডিউলগুলি পরীক্ষা করার সময় দরকারী।

সম্পাদনা :

পাইথন 3 এ importlibমডিউলটি করা উচিত:

এর ডক importlib.util.find_spec:

নির্দিষ্ট মডিউলটির জন্য বৈশিষ্টটি ফেরত দিন।

প্রথমে, sys.modules মডিউলটি ইতিমধ্যে আমদানি করা হয়েছে কিনা তা পরীক্ষা করা হয়। যদি তা হয় তবে sys.modules [নাম]। ফটকা ফিরে আসে। যদি এটি কোনওটিতে সেট করা হয়ে থাকে, তবে মানমূল্য উত্থাপিত হবে। মডিউলটি যদি সিস.মোডিউলগুলিতে না থাকে, তবে সায়স.মেটা_পথটি সন্ধানকারীদের প্রদত্ত 'পথের' মান সহ একটি উপযুক্ত স্পাইসের জন্য অনুসন্ধান করা হবে। কোনও অনুমান খুঁজে পাওয়া না গেলে কিছুই ফেরানো হয় না।

যদি নামটি সাবমডিউলের (কোনও বিন্দু সহ) থাকে তবে প্যারেন্ট মডিউলটি স্বয়ংক্রিয়ভাবে আমদানি হয়।

নাম এবং প্যাকেজ আর্গুমেন্টগুলি Importlib.import_module () এর মতোই কাজ করে। অন্য কথায়, আপেক্ষিক মডিউল নামগুলি (শীর্ষস্থানীয় বিন্দু সহ) কাজ করে।


2
আইপিথ 2 (বর্তমান সংস্করণ 2.7.13) এ ছাপিয়ে যায় না। আইপিটি 3.4 থেকে পাইথন 3 এ অবচয় করা হয়েছে। আমদানি পরিবর্তে পাইথন 3 ব্যবহার করা হবে। আমি এই সমাধান মত, কারণ এটি এমনকি কাজ করে যখন প্রকৃত আমদানি ব্যর্থ হবে (যেমন কারণ একটি 32bit ইঞ্জিন 64bit মডিউল)
mdew

64 বিট স্ক্লাইট 3 এর পথ খুঁজে পাওয়ার এবং আমদানি ব্যর্থ হওয়ার সময় সত্যিই দুর্দান্ত। পারফেক্ট।
rahvin_t

2
importlib.machinery.PathFinder().find_module("os").get_filename()imp.find_moduleপাইথন 3 + এ আমি সবচেয়ে সংক্ষিপ্ত বিকল্প খুঁজে পেয়েছি। যদি কেউ এর ব্যবহারের সন্ধান করে থাকে importlib.util.find_spec
টর্ক্সড

এই পদ্ধতিটি প্রকৃত মডিউলটি আমদানি না করেই কাজ করে, যা একটি ভাগ করা কম্পিউটার থেকে মডিউলটির কোন সংস্করণ আমদানি করা হচ্ছে তা নির্ধারণ করতে আমি এটি ব্যবহার করায় দুর্দান্ত।
গৌড়

19

এটা ছিল তুচ্ছ।

প্রতিটি মডিউলের একটি __file__পরিবর্তনশীল রয়েছে যা আপনি এখনই যেখান থেকে রয়েছেন তার আপেক্ষিক পথটি দেখায়।

অতএব, মডিউলটি এটি সূচিত করার জন্য একটি ডিরেক্টরি পাওয়া সহজ হিসাবে:

os.path.dirname(__file__)

14
প্রায় কিন্তু পুরোপুরি ঠিক - ফাইল হয় না "যেখানে আপনি ডান এখন আছেন আপেক্ষিক"; এটি যখন আপেক্ষিক (এটি কেবল তখনই হবে যখন সিস.পাথের আপেক্ষিক পাথ থাকবে), এটি মডিউলটি লোড হওয়ার সময় আপনি কোথায় ছিলেন সে সম্পর্কিত
চার্লস ডাফি

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

1
আমার লিনাক্স অজগর ২.6 এ কাজ করে না যেহেতু __file__কেবল দির / টেস্ট.পিই, অ্যাবপথ সিডডির সাথে যুক্ত করে যে পাথ নামটি কাঙ্ক্ষিত ফলাফল নয়, তবে আপনি যদি কোনও মডিউল আমদানি করেন 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

তাই আমি পাইপেক্সের সাথে এটি করার চেষ্টা করার জন্য যথেষ্ট সময় ব্যয় করলাম সমস্যাটি ছিল স্ক্রিপ্টের বেস ফোল্ডারটি পাই এটি পাইথন স্ক্রিপ্ট হিসাবে চালিত হচ্ছে বা পাইপেক্স এক্সেকিউটেবল হিসাবে। এটি বর্তমান ফোল্ডার, অন্য ফোল্ডার বা সিস্টেমের পথ থেকে (এটি সবচেয়ে কঠিন) থেকে চালিত হচ্ছে কিনা তা কাজ করার জন্য।

অবশেষে আমি সিএস.ফ্রোজেনকে পাইপেক্সে চলার সূচক হিসাবে ব্যবহার করে এই পদ্ধতিটি ব্যবহার করেছি:

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

আপনি যদি প্যাকেজের কোনও মডিউল থেকে মূলের পথটি পুনরুদ্ধার করতে চান তবে নিম্নলিখিত কাজগুলি (পাইথন ৩.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()কল। এটি দিরকে সেট করে ., যার অর্থ বর্তমান ডিরেক্টরি এবং কোনও পাথ সম্পর্কিত ফাংশনের জন্য একটি বৈধ ডিরেক্টরি।

সুতরাং, ব্যবহার abspath()সত্যিই প্রয়োজন হয় না। তবে আপনি যদি যাইহোক এটি ব্যবহার করেন তবে কৌশলটির প্রয়োজন নেই: abspath()খালি পাথ গ্রহণ করে এবং এটি বর্তমান ডিরেক্টরি হিসাবে সঠিকভাবে ব্যাখ্যা করে।


আরও ভাল অর্ডার অদলবদল করুন এবং কেবল ব্যবহার করুন os.path.dirname(os.path.abspath(__file__))কারণ তখন আপনাকে আপেক্ষিক পাথ সম্পর্কে মোটেই চিন্তা করতে হবে না। বাগগুলির জন্য একটি কম সুযোগ।
szali

3

আমি একটি সাধারণ দৃশ্যের সাথে (পাইথন 3 এ) অবদান রাখতে এবং এর কয়েকটি পদ্ধতির অন্বেষণ করতে চাই।

অন্তর্নির্মিত ফাংশন খোলা () আপেক্ষিক বা পরম পথটিকে তার প্রথম যুক্তি হিসাবে গ্রহণ করে। আপেক্ষিক পাথটি বর্তমান চলমান ডিরেক্টরি ডিরেক্টরি হিসাবে আপেক্ষিক হিসাবে বিবেচনা করা হয় তবে ফাইলের নিখুঁত পথটি অতিক্রম করার পরামর্শ দেওয়া হয়।

সহজভাবে বলেছিলেন, আপনি যদি নিম্নলিখিত কোড সহ কোনও স্ক্রিপ্ট ফাইল চালনা করেন তবে তা হয় তবে গ্যারান্টি দেওয়া না যে example.txtস্ক্রিপ্ট ফাইলটি অবস্থিত সেখানে একই ডিরেক্টরিতে ফাইলটি তৈরি করা হবে:

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

এই কোডটি ঠিক করার জন্য আমাদের স্ক্রিপ্টের পাথ পেতে এবং এটি পরম করতে হবে। পথটি নিখুঁত হওয়ার জন্য নিশ্চিত হয়ে আমরা কেবল os.path.relpath () ফাংশনটি ব্যবহার করি । স্ক্রিপ্টে পাথ পাওয়ার জন্য বেশ কয়েকটি সাধারণ ফাংশন রয়েছে যা বিভিন্ন পথের ফলাফল দেয়:

  • 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

প্লাজমাবিন্টুরং পোস্টের ভিত্তিতে আমি কোডটি সংশোধন করেছি।


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 ~]#
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.