কেন কেউ os.path.abspath এবং os.path.relpath উভয় ব্যবহার করবে?


99

একাধিক ওপেন সোর্স প্রকল্পগুলিতে, আমি os.path.abspath(os.path.realpath(__file__))বর্তমান ফাইলের নিখুঁত পথ পেতে লোকজনকে করতে দেখেছি ।

যাইহোক, আমি এটি খুঁজে পাই os.path.abspath(__file__)এবং os.path.realpath(__file__)একই ফলাফল উত্পাদন করি। os.path.abspath(os.path.realpath(__file__))কিছুটা অপ্রয়োজনীয় বলে মনে হচ্ছে

লোকেরা এটি ব্যবহার করার কোনও কারণ আছে?

উত্তর:


67

os.path.realpath যে অপারেটিং সিস্টেমগুলিকে সমর্থন করে তাদের প্রতীকী লিঙ্কগুলি অবজ্ঞা করে।

os.path.abspathকেবল ভালো জিনিস সরিয়ে ফেলা হবে .এবং ..পথ থেকে নামের ফাইল (অথবা সিমবলিক লিঙ্ক) এর তালিকা গাছের শিকড় থেকে সম্পূর্ণ পথ দান

উদাহরণস্বরূপ, উবুন্টুতে

$ ls -l
total 0
-rw-rw-r-- 1 guest guest 0 Jun 16 08:36 a
lrwxrwxrwx 1 guest guest 1 Jun 16 08:36 b -> a

$ python
Python 2.7.11 (default, Dec 15 2015, 16:46:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> from os.path import abspath, realpath

>>> abspath('b')
'/home/guest/play/paths/b'

>>> realpath('b')
'/home/guest/play/paths/a'

সিমলিংকগুলিতে আপেক্ষিক পাথ থাকতে পারে, সুতরাং উভয় ব্যবহারের প্রয়োজন। অভ্যন্তরীণ কলটি realpathএম্বেড থাকা ..অংশগুলির সাথে কোনও পথ ফিরে আসতে পারে , যা abspathপরে সরিয়ে দেয়।


10
যদিও এই উত্তর দুটি ফাংশনের মধ্যে পার্থক্য বর্ণনা করে, এটি সত্য নয় যে ফলাফলের ফলে উপাদানগুলি realpath()থাকতে পারে ..এবং আপনি কেন উভয় ব্যবহার করবেন এই প্রশ্নের সত্যই উত্তর দেয় না; জোব্রাদের উত্তর আরও সঠিক।
মাইলস

পাইথন ৩.7 এবং উইন্ডোগুলির জন্য, রিয়েলপথ সাবস্ক্রাইড ড্রাইভগুলি বুঝতে পারে না সুতরাং একটি সাবস্ক্রাইভ করা ড্রাইভের জন্য পি: say বলুন, উত্স ফোল্ডারটি সি: \ মাইফোল্ডার \ ব্লে, রিয়েলপ্যাথ পি: \ সি নয়: \ মাইফোল্ডার \ ব্লেড বলে। "আসল" পাথ কীভাবে পাবে কেউ জানে?
টোটে কার্লসন

আমার জন্য, abspathএখনও বর্তমান ডিরেক্টরিটি যদি একটি সিমিলিংক হয় তবে এখনও সিমলিংকগুলি অনুসরণ করে। এই আচরণটি থামানোর জন্য আমি কেবল এই উত্তরটি stackoverflow.com/questions/54665065/… পেয়েছি ।
ভিক্টর সার্জিইঙ্কো

109

আপনার বর্ণিত দৃশ্যের জন্য, রিয়েলপথ এবং অ্যাবসপাথ একত্রিত করার কোনও কারণ নেই, যেহেতু ফলাফল ফেরত দেওয়ার আগে os.path.realpathআসলে কল করে os.path.abspath(আমি পাইথন 2.5 থেকে পাইথন ৩.6 এ দেখেছি)।

  • os.path.abspath পরম পথটি ফিরিয়ে দেয় তবে এর যুক্তিতে প্রতিলিঙ্কগুলি সমাধান করে না।
  • os.path.realpath প্রথমে পথে কোনও প্রতীকী লিঙ্কগুলি সমাধান করবে এবং তারপরে পরম পথটি ফিরিয়ে দেবে।

তবে, আপনি যদি আশা করেন যে আপনার পাথটিতে একটি রয়েছে ~, তবে অ্যাবসপথ বা রিয়েলপথ উভয়ই ~ব্যবহারকারীর হোম ডিরেক্টরিতে সমাধান করবে না এবং ফলাফলটি অবৈধ হবেos.path.expanduserএটি ব্যবহারকারীর ডিরেক্টরিতে সমাধান করতে আপনাকে ব্যবহার করতে হবে।

পুঙ্খানুপুঙ্খ ব্যাখ্যার জন্য, এখানে কয়েকটি ফলাফল যা আমি উইন্ডোজ এবং লিনাক্স, পাইথন ৩.৪ এবং পাইথন ২.6 এ যাচাই করেছি। বর্তমান ডিরেক্টরি ( ./) হ'ল আমার হোম ডিরেক্টরি, যা দেখতে এটির মতো দেখাচ্ছে:

myhome
|- data (symlink to /mnt/data)
|- subdir (extra directory, for verbose explanation)
# os.path.abspath returns the absolute path, but does NOT resolve symlinks in its argument
os.path.abspath('./')
'/home/myhome'
os.path.abspath('./subdir/../data')
'/home/myhome/data'


# os.path.realpath will resolve symlinks AND return an absolute path from a relative path
os.path.realpath('./')
'/home/myhome'
os.path.realpath('./subdir/../')
'/home/myhome'
os.path.realpath('./subdir/../data')
'/mnt/data'

# NEITHER abspath or realpath will resolve or remove ~.
os.path.abspath('~/data')
'/home/myhome/~/data'

os.path.realpath('~/data')
'/home/myhome/~/data'

# And the returned path will be invalid
os.path.exists(os.path.abspath('~/data'))
False
os.path.exists(os.path.realpath('~/data'))
False

# Use realpath + expanduser to resolve ~
os.path.realpath(os.path.expanduser('~/subdir/../data'))
'/mnt/data'

4
ভাল লাগল আপনার বক্তব্যটি তৈরি করার জন্য আপনার শেষ উদাহরণটি হওয়া উচিতos.path.realpath(os.path.expanduser('~/subdir/../data'))
আর্থার

4
তারপরে ওস.পাথ.এক্সপান্ড্বরগুলি সম্পর্কেও ভুলে যাবেন না যদি চলকগুলি কোনও পথে ব্যবহার করা হয়
স্ল্যাভেনস্কিজে

8

সাধারণ লোকের শর্তে, আপনি যদি একটি শর্টকাট ফাইলের পাথ পেতে চেষ্টা করছেন, নিরঙ্কুশ পথটি শর্টকাটের লোকেশনটিতে উপস্থিত ফাইলের সম্পূর্ণ পথ দেয়, যখন রিয়েলপথ ফাইলটির আসল অবস্থানের পথ দেয় ।

পরম পাথ, os.path.abspath (), ফাইলটির সম্পূর্ণ পথ দেয় যা বর্তমান ওয়ার্কিং ডিরেক্টরি বা আপনার উল্লিখিত ডিরেক্টরিতে অবস্থিত।

আসল পাথ, os.path.relpath (), ফাইলটির পুরো পথ দেয় যা উল্লেখ করা হচ্ছে।

যেমন:

file = "shortcut_folder/filename"
os.path.abspath(file) = "C:/Desktop/shortcut_folder/filename"
os.path.realpath(file) = "D:/PyCharmProjects/Python1stClass/filename"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.