উত্তর:
আপনি __file__বর্তমান ফাইলটির নাম পেতে ব্যবহার করতে পারেন । মূল মডিউলটিতে ব্যবহার করার সময়, এটি স্ক্রিপ্টটির নাম যা মূলত আহ্বান করা হয়েছিল।
আপনি যদি ডিরেক্টরি অংশটি বাদ দিতে চান (যা উপস্থিত থাকতে পারে), আপনি ব্যবহার করতে পারেন os.path.basename(__file__)।
__file__ইন্টারেক্টিভ দোভাষীর সংজ্ঞা দেওয়া হয়নি, কারণ এটি সেখানে অর্থহীন। এটি আমদানি বাস্তবায়ন দ্বারা সেট করা হয়েছে, সুতরাং আপনি যদি মানহীন আমদানি পদ্ধতি ব্যবহার করেন তবে এটি সেট নাও হতে পারে।
import osএটি কাজ করার জন্য একটি প্রয়োজন is আমি এটি উত্তরে যুক্ত করব।
import osএবং import os.pathসম্পূর্ণ সমতুল্য।
import sys
print sys.argv[0]
এই মুদ্রণ করবে foo.pyজন্য python foo.py, dir/foo.pyজন্য python dir/foo.pyইত্যাদি এটা প্রথম যুক্তি python। (নোট করুন পাইপেক্সের পরে এটি হবে foo.exe))
python linkfile.py, যেখানে linkfile.pyএকটি সিমবলিক লিঙ্ক হয় realfile.py, sys.argv[0]হতে হবে 'linkfile.py', যা বা পারে আবার নাও পারে কি আপনি চান; এটি অবশ্যই আমি প্রত্যাশা করি । __file__একই: এটি হবে linkfile.py। আপনি যদি এটি 'realfile.py'থেকে সন্ধান করতে চান তবে 'linkfile.py'চেষ্টা করুন os.path.realpath('linkfile.py')।
__file__পরিবর্তে ব্যবহার করুন।
সম্পূর্ণতার জন্য, আমি ভেবেছিলাম এটি বিভিন্ন সম্ভাব্য ফলাফলের সংক্ষিপ্তসার এবং প্রত্যেকটির যথাযথ আচরণের জন্য রেফারেন্স সরবরাহ করা সার্থক হবে:
__file__অফিসিয়াল ডকুমেন্টেশনে বর্ণিত হিসাবে বর্তমানে ফাইলটি কার্যকর করা হচ্ছে :
__file__মডিউলটি লোড করা হয়েছিল এমন ফাইলের পাথের নাম, যদি এটি কোনও ফাইল থেকে লোড করা হয়।__file__অ্যাট্রিবিউট যেমন মডিউল, কিছু নির্দিষ্ট নিখোঁজ হতে পারে সি মডিউল যা স্ট্যাটিক্যালি ব্যাখ্যাকারী মধ্যে সংযুক্ত থাকে; একটি ভাগ করা লাইব্রেরি থেকে গতিশীল লোড এক্সটেনশন মডিউলগুলির জন্য, এটি ভাগ করা লাইব্রেরি ফাইলের পথের নাম।
Python3.4 থেকে অগ্রে, প্রতি ইস্যু 18416 , __file__সবসময় একটি সুনির্দিষ্ট পাথ, যদি না আপনি বর্তমানে নির্বাহ ফাইল একটি স্ক্রিপ্ট যা সরাসরি মৃত্যুদন্ড কার্যকর করা হয়েছে (না সঙ্গে অনুবাদক মাধ্যমে হয় -mকমান্ড লাইন বিকল্প) একটি আপেক্ষিক পাথ ব্যবহার করে।
__main__.__file__(আমদানির প্রয়োজন __main__) কেবলমাত্র মূল মডিউলটির পূর্বোক্ত __file__বৈশিষ্ট্যগুলি অ্যাক্সেস করে , যেমন কমান্ড লাইন থেকে অনুরোধ করা স্ক্রিপ্টের।
sys.argv[0](আমদানি করা প্রয়োজন sys) হ'ল স্ক্রিপ্টের নাম যা কমান্ড লাইন থেকে আহ্বান করা হয়েছিল এবং এটি সরকারী ডকুমেন্টেশনে বর্ণিত একটি নিখুঁত পথ হতে পারে :
argv[0]স্ক্রিপ্টের নাম (এটি পুরো পথের নাম কিনা তা অপারেটিং সিস্টেম নির্ভর করে)। কমান্ডটি যদি-cঅনুবাদকারীর কাছে কমান্ড লাইন বিকল্প ব্যবহার করে কার্যকর করা হয় ,argv[0]তবে স্ট্রিংটিতে সেট করা হবে'-c'। পাইথন ইন্টারপ্রেটারে যদি কোনও স্ক্রিপ্টের নামটি না দেওয়াargv[0]হয় তবে তা খালি স্ট্রিং।
এই প্রশ্নের অন্য উত্তরে যেমন উল্লেখ করা হয়েছে , পাইথন স্ক্রিপ্টগুলি যেগুলি সরঞ্জামের মাধ্যমে একা একা এক্সিকিউটেবল প্রোগ্রামে রূপান্তরিত হয়েছিল py2exe বা PyInstaller কাঙ্ক্ষিত ফলাফল প্রদর্শন করা হয় না পারে যখন এই পদ্ধতির ব্যবহার (অর্থাতsys.argv[0]নাম বদলে এক্সিকিউটেবল নামে রাখা হবেএক্সিকিউটেবলের মধ্যেমূল পাইথন ফাইলের)।
যদি পূর্বোক্ত বিকল্পগুলির মধ্যে কোনওটিই কাজ করে না বলে মনে হয়, সম্ভবত একটি অনিয়মিত আমদানি ক্রিয়াকলাপের কারণে পরিদর্শন মডিউলটি কার্যকর প্রমাণিত হতে পারে। বিশেষ করে, invoking inspect.getfile(...)উপরinspect.currentframe() , কাজ করতে পারে, যদিও আধুনিক হবে আসতেNone যখন ছাড়া একটি বাস্তবায়ন চলমান পাইথন স্ট্যাক ফ্রেম।
বর্তমান স্ক্রিপ্টটি যদি একটি প্রতীকী লিঙ্ক হয়, তবে উপরের সমস্তগুলি প্রকৃত ফাইলের পাথের পরিবর্তে প্রতীকী লিঙ্কের পথটি ফিরে আসবে os.path.realpath(...)এবং পরবর্তীটি বের করার জন্য অনুরোধ করা উচিত।
os.path.basename(...)প্রকৃত ফাইলের নাম আহরণের জন্য উপরের os.path.splitext(...)যে কোনওটির সাথে অনুরোধ করা যেতে পারে এবং প্রকৃত ফাইলের নামের সাথে অনুরোধ করা যেতে পারে যেমন এটির প্রত্যয়টি কাটা যায় os.path.splitext(os.path.basename(...))।
থেকে পাইথন 3.4 অগ্রে, প্রতি PEP 428 , PurePathবর্গ এর pathlibমডিউল উপরে কোনো পাশাপাশি ব্যবহৃত হতে পারে। বিশেষত, pathlib.PurePath(...).nameপ্রকৃত ফাইলের নামটি pathlib.PurePath(...).stemবের করে এবং তার প্রত্যয় ছাড়াই প্রকৃত ফাইলের নাম বের করে।
দ্রষ্টব্য যে __file__এই কোডটি যেখানে থাকে সেই ফাইলটি দেয়, যা আমদানি করা যায় এবং মূল ফাইলটির ব্যাখ্যা করা থেকে আলাদা। মূল ফাইলটি পেতে, বিশেষ __main__ মডিউলটি ব্যবহার করা যেতে পারে:
import __main__ as main
print(main.__file__)
দ্রষ্টব্য যে __main__.__file__পাইথন ২.7 এ কাজ করে তবে ৩.২-তে নয়, তাই এটি পোর্টেবল করতে উপরে যেমন আমদানি-তেমন সিনট্যাক্স ব্যবহার করুন।
rPythonথেকে প্যাকেজটি ব্যবহার করার সময় নয় not Rএটি অবশ্যই একটি ব্যতিক্রমী কেস হতে হবে যা পরিচালনা করা খুব শক্ত।
__main__অভ্যন্তরীণভাবে আমদানি করে Rএবং এর মধ্যে ভেরিয়েবলগুলি পাস করার জন্য python, তাই __main__.__file__অন্য কোনও কিছু বলার আগে এটি সেট করা তুলনামূলকভাবে সহজ হবে , তবে এই ক্ষেত্রে উপযুক্ত মান কী হবে তা আমি এখনও নিশ্চিত নই।
উপরের উত্তরগুলি ভাল। তবে আমি উপরের ফলাফলগুলি ব্যবহার করে এই পদ্ধতিটিকে আরও দক্ষ বলে মনে করেছি।
এটি প্রকৃত স্ক্রিপ্ট ফাইলের নামে কোনও পাথ নয় results
import sys
import os
file_name = os.path.basename(sys.argv[0])
আধুনিক পাইথন সংস্করণগুলির জন্য (3.4+), Path(__file__).nameআরও বুদ্ধিমানের হওয়া উচিত। এছাড়াও, Path(__file__).stemআপনাকে .pyএক্সটেনশন ছাড়াই স্ক্রিপ্টের নাম দেয় ।
from pathlib import Pathপ্রথম করা উচিত ।
pathlibপাইথন ৩.৪ এ প্রবর্তিত হয়েছিল, তাই এটি পাইথন ৩.৪ থেকে শুরু করে কাজ করা উচিত।
ধরে নিচ্ছি যে ফাইলের foo.pyনামটি নীচের স্নিপেট
import sys
print sys.argv[0][:-3]
অথবা
import sys
print sys.argv[0][::-1][3:][::-1]
আরও অক্ষর সহ অন্যান্য extentions হিসাবে উদাহরণস্বরূপ ফাইলের নাম foo.pypy
import sys
print sys.argv[0].split('.')[0]
আপনি যদি একটি নিখুঁত পথ থেকে নিষ্কাশন করতে চান
import sys
print sys.argv[0].split('/')[-1].split('.')[0]
আউটপুট হবে foo
সিস্টেমে প্রথম যুক্তিটি বর্তমান ফাইলের নাম হবে তাই এটি কাজ করবে
import sys
print sys.argv[0] # will print the file name
যদি আপনি কোনও অস্বাভাবিক আমদানি করছেন (যেমন, এটি একটি বিকল্প ফাইল), চেষ্টা করুন:
import inspect
print (inspect.getfile(inspect.currentframe()))
দ্রষ্টব্য যে এটি ফাইলের পরম পাথ ফিরে আসবে।
আমার দ্রুত নোংরা সমাধান:
__file__.split('/')[-1:][0]
os.pathফাইলের নামগুলি বিভক্ত করার জন্য আরও ভাল ব্যবহার
os.path.abspath(__file__)আপনাকে পরম পথ দেবে ( relpath()পাশাপাশি উপলব্ধ)।
sys.argv[-1] আপনাকে একটি আপেক্ষিক পথ দেবে
এই সমস্ত উত্তর দুর্দান্ত, তবে কিছু সমস্যা আছে যা আপনি প্রথম নজরে দেখতে পাবেন না।
আমরা যা চাই তা সংজ্ঞায়িত করতে পারি - আমরা সম্পাদিত স্ক্রিপ্টটির নাম চাইছি, বর্তমান মডিউলটির নাম নয় - তাই __file__কেবলমাত্র এটি কার্যকর হবে যদি এটি আমদানি করা মডিউলে নয়, তবে সম্পাদিত স্ক্রিপ্টে ব্যবহৃত হয়।
sys.argvপ্রশ্নবিদ্ধ - যদি আপনার প্রোগ্রামটি পাইয়েস্ট দ্বারা ডাকা হত? নাকি পাইডোক রানার? নাকি তা উউসগি বলেছে?
এবং - স্ক্রিপ্টের নাম পাওয়ার তৃতীয় পদ্ধতি আছে, আমি উত্তরগুলিতে দেখিনি - আপনি স্ট্যাকটি পরিদর্শন করতে পারেন।
আরেকটি সমস্যা হল, যে আপনি (অথবা অন্য কোনো প্রোগ্রাম) নিয়ে অবৈধ প্রভাব বিস্তার করতে পারেন sys.argvএবং __main__.__file__- এটা থাকতে পারে, এটা হতে পারে না। এটি বৈধ হতে পারে, নাও হতে পারে। স্ক্রিপ্ট (পছন্দসই ফলাফল) উপস্থিত রয়েছে কিনা তা অন্তত আপনি পরীক্ষা করতে পারেন!
আমার গ্রন্থাগার বিট্রানক্স / লিবি_গ্রোথ গিথুব ঠিক তেমনটি করে:
__main__উপস্থিত কিনা পরীক্ষা করুন__main__.__file__উপস্থিত কিনা পরীক্ষা করুন__main__.__file__একটি বৈধ ফলাফল (স্ক্রিপ্টটি কোন অস্তিত্ব নেই?)যে ভাবে করে, আমার সমাধান এতদূর সঙ্গে কাজ করছে setup.py test, uwsgi, pytest, pycharm pytest, pycharm docrunner (doctest), dreampie,eclipse
ডাফ হেলম্যানের "সমস্যাটি পাইথন থেকে প্রক্রিয়াটির নাম নির্ধারণ করা" এর একটি দুর্দান্ত ব্লগ নিবন্ধও রয়েছে
পাইথন 3.5 হিসাবে আপনি সহজভাবে এটি করতে পারেন:
from pathlib import Path
Path(__file__).stem
এখানে আরও দেখুন: https://docs.python.org/3.5/library/pathlib.html#pathlib.PurePath.stem
উদাহরণস্বরূপ, আমার ব্যবহারকারী ডিরেক্টরিতে test.pyএই ফাইলটির অভ্যন্তরে নাম রয়েছে:
from pathlib import Path
print(Path(__file__).stem)
print(__file__)
এই ফলাফলগুলি চলছে:
>>> python3.6 test.py
test
test.py
Exception NameError: NameError("global name '__file__' is not defined",)"