পাইথনে বর্তমান স্ক্রিপ্টের নাম পান


407

আমি বর্তমানে চলছে যে পাইথন স্ক্রিপ্টটির নাম পাওয়ার চেষ্টা করছি।

আমার কাছে একটি স্ক্রিপ্ট ফোন আছে foo.pyএবং আমি স্ক্রিপ্টটির নাম পেতে এই জাতীয় কিছু করতে চাই:

print Scriptname

উত্তর:


620

আপনি __file__বর্তমান ফাইলটির নাম পেতে ব্যবহার করতে পারেন । মূল মডিউলটিতে ব্যবহার করার সময়, এটি স্ক্রিপ্টটির নাম যা মূলত আহ্বান করা হয়েছিল।

আপনি যদি ডিরেক্টরি অংশটি বাদ দিতে চান (যা উপস্থিত থাকতে পারে), আপনি ব্যবহার করতে পারেন os.path.basename(__file__)


15
পাইথন 3.2: " Exception NameError: NameError("global name '__file__' is not defined",)"
sdaau

20
@ এসডাও: __file__ইন্টারেক্টিভ দোভাষীর সংজ্ঞা দেওয়া হয়নি, কারণ এটি সেখানে অর্থহীন। এটি আমদানি বাস্তবায়ন দ্বারা সেট করা হয়েছে, সুতরাং আপনি যদি মানহীন আমদানি পদ্ধতি ব্যবহার করেন তবে এটি সেট নাও হতে পারে।
সোভেন মার্নাচ

8
কমপক্ষে পাইথন ২.7 এর জন্য, আমি বিশ্বাস করি import osএটি কাজ করার জন্য একটি প্রয়োজন is আমি এটি উত্তরে যুক্ত করব।
নিক চ্যামাস

14
@ cdunn2001: import osএবং import os.pathসম্পূর্ণ সমতুল্য।
সোভেন মারনাচ

2
@ সোভেন-মারনাচ: ওহ, আপনি ঠিক বলেছেন । আমি বছরের পর বছর ধরে এটি ভুল করে চলেছি!
cdunn2001

136
import sys
print sys.argv[0]

এই মুদ্রণ করবে foo.pyজন্য python foo.py, dir/foo.pyজন্য python dir/foo.pyইত্যাদি এটা প্রথম যুক্তি python। (নোট করুন পাইপেক্সের পরে এটি হবে foo.exe))


33
@ ডেনিসমালিনোভস্কি: "কাজ করবে না" সংজ্ঞা দিন। যদি আপনি কল python linkfile.py, যেখানে linkfile.pyএকটি সিমবলিক লিঙ্ক হয় realfile.py, sys.argv[0]হতে হবে 'linkfile.py', যা বা পারে আবার নাও পারে কি আপনি চান; এটি অবশ্যই আমি প্রত্যাশা করি__file__একই: এটি হবে linkfile.py। আপনি যদি এটি 'realfile.py'থেকে সন্ধান করতে চান তবে 'linkfile.py'চেষ্টা করুন os.path.realpath('linkfile.py')
ক্রিস মরগান

6
এটি +1 কারণ এটি (ক) সামান্য পরিষ্কার এবং (খ) এখনও মডিউলে কাজ করবে (যেখানে ফাইলের ভেরিয়েবলটি মডিউল ফাইল হবে, মৃত্যুদন্ড কার্যকর নয়)।
রবার্ট

এই উত্তরটি দুর্দান্ত কারণ এটি আইডলিতেও কাজ করে। একটি নোট হিসাবে, কেবল ফাইলের নাম পেতে, আপনি os.path.basename (sys.argv [0]) লিখতে পারেন
স্টিভেন ব্লুয়েন

আরও গুরুত্বপূর্ণ বিষয়, এটি মূল ফাইলের অভ্যন্তর ব্যতীত কাজ করে না। এটি ব্যবহার করবেন না, __file__পরিবর্তে ব্যবহার করুন।
অ্যাপলিগুলি মনিকা

কি!!! আপনি কি এটি চেষ্টা করেও দেখেছেন? ঠিক এর বিপরীতটি সত্য। প্রশ্নকর্তা যে পাইথন স্ক্রিপ্ট চলছে তার নাম জিজ্ঞাসা করলেন - বর্তমানে যে অজগর ফাইলটি চলছে তা নয় not কল্পনা করুন যে আপনার কাছে একটি স্ক্রিপ্ট রয়েছে যা কোনও ত্রুটি দেখা দিলে অনুমোদিত আর্গুমেন্টের সাথে স্ক্রিপ্টের নাম মুদ্রণ করে। আপনি এই 2 টি কৌশলগুলির মধ্যে একটি ব্যবহার করে এটি কোনও ফাংশনে রেখেছেন। কিছু পর্যায়ে, আপনি ফাংশনটি একটি বাহ্যিক গ্রন্থাগারে স্থানান্তরিত করার সিদ্ধান্ত নিয়েছেন। আপনি কি চলমান মূল স্ক্রিপ্টের নাম, বা চালিত লাইব্রেরি ফাইলটির নাম মুদ্রণ করতে চান?
জন ডিঘান 13

70

সম্পূর্ণতার জন্য, আমি ভেবেছিলাম এটি বিভিন্ন সম্ভাব্য ফলাফলের সংক্ষিপ্তসার এবং প্রত্যেকটির যথাযথ আচরণের জন্য রেফারেন্স সরবরাহ করা সার্থক হবে:

  • __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বের করে এবং তার প্রত্যয় ছাড়াই প্রকৃত ফাইলের নাম বের করে।


66

দ্রষ্টব্য যে __file__এই কোডটি যেখানে থাকে সেই ফাইলটি দেয়, যা আমদানি করা যায় এবং মূল ফাইলটির ব্যাখ্যা করা থেকে আলাদা। মূল ফাইলটি পেতে, বিশেষ __main__ মডিউলটি ব্যবহার করা যেতে পারে:

import __main__ as main
print(main.__file__)

দ্রষ্টব্য যে __main__.__file__পাইথন ২.7 এ কাজ করে তবে ৩.২-তে নয়, তাই এটি পোর্টেবল করতে উপরে যেমন আমদানি-তেমন সিনট্যাক্স ব্যবহার করুন।


এটি অনেক ক্ষেত্রে কাজ করে তবে আমি ভাষা rPythonথেকে প্যাকেজটি ব্যবহার করার সময় নয় not Rএটি অবশ্যই একটি ব্যতিক্রমী কেস হতে হবে যা পরিচালনা করা খুব শক্ত।
লিওনিড

প্রকৃতপক্ষে, আর পাইথন প্যাকেজটি পাইথন ইন্টারপ্রেটারকে এম্বেড করে, যার অর্থ 'পাইথন' নিজে চালিত হওয়ার সময় সেখানে একটি 'প্রধান' ফাইল থাকে না (আপনি পাইথনটি এম্বেড করার সময় একই আচরণ দেখতে পাবেন)। এটি __main__অভ্যন্তরীণভাবে আমদানি করে Rএবং এর মধ্যে ভেরিয়েবলগুলি পাস করার জন্য python, তাই __main__.__file__অন্য কোনও কিছু বলার আগে এটি সেট করা তুলনামূলকভাবে সহজ হবে , তবে এই ক্ষেত্রে উপযুক্ত মান কী হবে তা আমি এখনও নিশ্চিত নই।
পার্কিনস

42

উপরের উত্তরগুলি ভাল। তবে আমি উপরের ফলাফলগুলি ব্যবহার করে এই পদ্ধতিটিকে আরও দক্ষ বলে মনে করেছি।
এটি প্রকৃত স্ক্রিপ্ট ফাইলের নামে কোনও পাথ নয় results

import sys    
import os    
file_name =  os.path.basename(sys.argv[0])

1
আমি এক্সটেনশানটিও বিভক্ত করতে চাই, তাই আমি ব্যবহার করি: os.path.splitext (os.path.basename (sys.argv [0])) [0]
রুফাসভিএস

19

আধুনিক পাইথন সংস্করণগুলির জন্য (3.4+), Path(__file__).nameআরও বুদ্ধিমানের হওয়া উচিত। এছাড়াও, Path(__file__).stemআপনাকে .pyএক্সটেনশন ছাড়াই স্ক্রিপ্টের নাম দেয় ।


নামের ত্রুটি: নাম 'পাথ' সংজ্ঞায়িত করা হয়নি
RufusVS

5
আপনার from pathlib import Pathপ্রথম করা উচিত ।
এমিল মেলানিকভ

"আধুনিক" অর্থ পাইথন ৩.x?
einpoklum

1
@ আইনপোকলুম pathlibপাইথন ৩.৪ এ প্রবর্তিত হয়েছিল, তাই এটি পাইথন ৩.৪ থেকে শুরু করে কাজ করা উচিত।
আন্দ্রে সেমাকিন


9

দ্রষ্টব্য: আপনি যদি পাইথন 3+ ব্যবহার করেন তবে তার পরিবর্তে আপনার মুদ্রণ () ফাংশনটি ব্যবহার করা উচিত

ধরে নিচ্ছি যে ফাইলের 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


1
sys.argv [0] [: - 3] করবে
kon psych

@ কনসসিচ এটি আরও মার্জিত
21

তার মাঝে বড় পার্থক্য __file__এবং sys.argv[0]দেখ, stackoverflow.com/questions/5851588/...
Maksym Ganenko

8

সিস্টেমে প্রথম যুক্তিটি বর্তমান ফাইলের নাম হবে তাই এটি কাজ করবে

   import sys
   print sys.argv[0] # will print the file name

7

যদি আপনি কোনও অস্বাভাবিক আমদানি করছেন (যেমন, এটি একটি বিকল্প ফাইল), চেষ্টা করুন:

import inspect
print (inspect.getfile(inspect.currentframe()))

দ্রষ্টব্য যে এটি ফাইলের পরম পাথ ফিরে আসবে।


3

আমরা এক্সটেনশন ছাড়াই বর্তমান স্ক্রিপ্টের নাম পেতে এটি চেষ্টা করতে পারি।

import os

script_name = os.path.splitext(os.path.basename(__file__))[0]

2

যেহেতু ওপি বর্তমান স্ক্রিপ্ট ফাইলটির নাম চেয়েছে আমি পছন্দ করব

import os
os.path.split(sys.argv[0])[1]



0

এই সমস্ত উত্তর দুর্দান্ত, তবে কিছু সমস্যা আছে যা আপনি প্রথম নজরে দেখতে পাবেন না।

আমরা যা চাই তা সংজ্ঞায়িত করতে পারি - আমরা সম্পাদিত স্ক্রিপ্টটির নাম চাইছি, বর্তমান মডিউলটির নাম নয় - তাই __file__কেবলমাত্র এটি কার্যকর হবে যদি এটি আমদানি করা মডিউলে নয়, তবে সম্পাদিত স্ক্রিপ্টে ব্যবহৃত হয়। sys.argvপ্রশ্নবিদ্ধ - যদি আপনার প্রোগ্রামটি পাইয়েস্ট দ্বারা ডাকা হত? নাকি পাইডোক রানার? নাকি তা উউসগি বলেছে?

এবং - স্ক্রিপ্টের নাম পাওয়ার তৃতীয় পদ্ধতি আছে, আমি উত্তরগুলিতে দেখিনি - আপনি স্ট্যাকটি পরিদর্শন করতে পারেন।

আরেকটি সমস্যা হল, যে আপনি (অথবা অন্য কোনো প্রোগ্রাম) নিয়ে অবৈধ প্রভাব বিস্তার করতে পারেন sys.argvএবং __main__.__file__- এটা থাকতে পারে, এটা হতে পারে না। এটি বৈধ হতে পারে, নাও হতে পারে। স্ক্রিপ্ট (পছন্দসই ফলাফল) উপস্থিত রয়েছে কিনা তা অন্তত আপনি পরীক্ষা করতে পারেন!

আমার গ্রন্থাগার বিট্রানক্স / লিবি_গ্রোথ গিথুব ঠিক তেমনটি করে:

  • __main__উপস্থিত কিনা পরীক্ষা করুন
  • __main__.__file__উপস্থিত কিনা পরীক্ষা করুন
  • দিতে না __main__.__file__একটি বৈধ ফলাফল (স্ক্রিপ্টটি কোন অস্তিত্ব নেই?)
  • যদি না: sys.argv পরীক্ষা করুন:
  • sys.argv এ পাইস্টেস্ট, ডকনারার ইত্যাদি আছে? -> যদি হ্যাঁ তবে তা উপেক্ষা করুন
  • আমরা কি এখানে বৈধ ফলাফল পেতে পারি?
  • যদি তা না হয়: স্ট্যাকটি পরিদর্শন করুন এবং সেখান থেকে সম্ভবত ফল পাবেন
  • এছাড়াও যদি স্ট্যাকটি বৈধ ফলাফল দেয় না, তবে একটি ব্যতিক্রম ছুঁড়ে দিন।

যে ভাবে করে, আমার সমাধান এতদূর সঙ্গে কাজ করছে setup.py test, uwsgi, pytest, pycharm pytest, pycharm docrunner (doctest), dreampie,eclipse

ডাফ হেলম্যানের "সমস্যাটি পাইথন থেকে প্রক্রিয়াটির নাম নির্ধারণ করা" এর একটি দুর্দান্ত ব্লগ নিবন্ধও রয়েছে


0

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