__file__ পরিবর্তনশীল এর অর্থ / কী?


177
A = os.path.join(os.path.dirname(__file__), '..')

B = os.path.dirname(os.path.realpath(__file__))

C = os.path.abspath(os.path.dirname(__file__))

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

উত্তর:


162

পাইথনের কোনও ফাইল থেকে মডিউল লোড করা হলে, __file__তার পথে সেট করা হয়। তারপরে আপনি ফাইলটি যে ডিরেক্টরিতে অবস্থিত তা সন্ধান করতে অন্যান্য ফাংশন সহ এটি ব্যবহার করতে পারেন।

একবারে আপনার উদাহরণ গ্রহণ করা:

A = os.path.join(os.path.dirname(__file__), '..')
# A is the parent directory of the directory where program resides.

B = os.path.dirname(os.path.realpath(__file__))
# B is the canonicalised (?) directory where the program resides.

C = os.path.abspath(os.path.dirname(__file__))
# C is the absolute path of the directory where the program resides.

আপনি এগুলি থেকে এখানে ফিরে আসা বিভিন্ন মান দেখতে পাবেন:

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

এবং আপনি বিভিন্ন অবস্থানগুলি থেকে এটি চালানোর (যেমন নিশ্চিত ./text.py, ~/python/text.pyএবং তাই ঘোষণা) দেখার কি পার্থক্য করে নির্মিত হয়।


7
ভাল উত্তর, তবে অন্যান্য উত্তর থেকে অন্য একটি গুরুত্বপূর্ণ বিবরণ দেখুন: __file__সমস্ত ক্ষেত্রে যেমন সংজ্ঞায়িত করা হয় না, যেমন স্থিরভাবে সংযুক্ত সি মডিউলগুলি। আমরা __file__সর্বদা উপলব্ধ থাকার উপর নির্ভর করতে পারি না ।
ক্রিস জনসন

5
দোভাষীতে, সমস্ত উদাহরণ ফিরে আসে name '__file__' is not defined
ব্যবহারকারী 1063287

10
@ user1063287 ডেমোউজারের উত্তরটি দেখুন; __file__মডিউলটি লোড করা হয়েছিল এমন ফাইলের পাথের নাম, যদি এটি কোনও ফাইল থেকে লোড করা হয়। এর অর্থ __file__কেবল তখনই কাজ করবে যখন আপনি এটি স্ক্রিপ্ট হিসাবে চালনাবেন দোভাষী হিসাবে নয় ((যদি না আপনি এটি দোভাষী তে আমদানি করেন ...)
যুব

59

আমি প্রথমে কিছু বিভ্রান্তির সমাধান করতে চাই। __file__এটি ওয়াইল্ডকার্ড নয় এটি একটি বৈশিষ্ট্য। ডাবল আন্ডারস্কোর বৈশিষ্ট্য এবং পদ্ধতিগুলি কনভেনশন দ্বারা "বিশেষ" হিসাবে বিবেচিত হয় এবং একটি বিশেষ উদ্দেশ্যে পরিবেশন করে।

http://docs.python.org/references/datamodel.html এগুলিতে না থাকলেও অনেকগুলি বিশেষ পদ্ধতি এবং বৈশিষ্ট্য দেখায়।

এই ক্ষেত্রে __file__একটি মডিউল (একটি মডিউল অবজেক্ট) এর একটি বৈশিষ্ট্য। পাইথনে একটি .pyফাইল একটি মডিউল। সুতরাং import amoduleএকটি বৈশিষ্ট্য থাকবে __file__যার অর্থ ভিন্ন ভিন্ন পরিস্থিতিতে বিভিন্ন জিনিস।

ডক্স থেকে নেওয়া:

__file__মডিউলটি লোড করা হয়েছিল এমন ফাইলের পাথের নাম, যদি এটি কোনও ফাইল থেকে লোড করা হয়। __file__অ্যাট্রিবিউট সি মডিউল যা স্ট্যাটিক্যালি ব্যাখ্যাকারী মধ্যে সংযুক্ত থাকে উপস্থিত নয়; একটি ভাগ করা লাইব্রেরি থেকে গতিশীল লোড এক্সটেনশন মডিউলগুলির জন্য, এটি ভাগ করা লাইব্রেরি ফাইলের পথের নাম।

আপনার ক্ষেত্রে মডিউলটি __file__বিশ্বব্যাপী নেমস্পেসে এটির নিজস্ব বৈশিষ্ট্য অ্যাক্সেস করছে ।

এটিকে ক্রিয়াতে দেখার চেষ্টা করুন:

# file: test.py

print globals()
print __file__

এবং চালান:

python test.py

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
 'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py

23

ডকুমেন্টেশন প্রতি :

__file__মডিউলটি লোড করা হয়েছিল এমন ফাইলের পাথের নাম, যদি এটি কোনও ফাইল থেকে লোড করা হয়। __file__অ্যাট্রিবিউট সি মডিউল যা স্ট্যাটিক্যালি ব্যাখ্যাকারী মধ্যে সংযুক্ত থাকে উপস্থিত নয়; একটি ভাগ করা লাইব্রেরি থেকে গতিশীল লোড এক্সটেনশন মডিউলগুলির জন্য, এটি ভাগ করা লাইব্রেরি ফাইলের পথের নাম।

এবং এছাড়াও :

__file__মডিউলটি অন্তর্নির্মিত না হলে (এবং এভাবে তালিকাভুক্ত করা sys.builtin_module_names) যদি অ্যাট্রিবিউট সেট না করা হয় তবে ফাইলটির "পথ" হতে হবে ।


13

__file__বিভিন্ন os.pathমডিউলগুলির সাথে একত্রিত ব্যবহার করে সমস্ত পাথ বর্তমান মডিউলটির ডিরেক্টরি অবস্থানের তুলনায় আপেক্ষিক হতে দেয়। এটি আপনার মডিউল / প্রকল্পগুলি অন্য মেশিনে পোর্টেবল হতে দেয় allows

আপনার প্রকল্পে আপনি:

A = '/Users/myname/Projects/mydevproject/somefile.txt'

এবং তারপরে একটি ডিপ্লয়মেন্ট ডিরেক্টরি সহ এটি আপনার সার্ভারে স্থাপন করার চেষ্টা করুন /home/web/mydevproject/তারপরে আপনার কোডটি সঠিকভাবে পাথগুলি খুঁজে পেতে সক্ষম হবে না।

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