আমার কি `আমদানি os.path` বা` আমদানি os` ব্যবহার করা উচিত?


139

সরকারী ডকুমেন্টেশন অনুসারে , os.pathএটি একটি মডিউল। সুতরাং, এটি আমদানির পছন্দসই উপায় কী?

# Should I always import it explicitly?
import os.path

অথবা ...

# Is importing os enough?
import os

দয়া করে "আমদানি osআমার পক্ষে কাজ করে " উত্তর দিবেন না। আমি জানি, এটি এখনই আমার পক্ষে কার্যকর (পাইথন ২. 2. হিসাবে)। আমি যা জানতে চাই তা হ'ল এই সমস্যা সম্পর্কে কোনও অফিশিয়াল সুপারিশ। সুতরাং, আপনি যদি এই প্রশ্নের উত্তর দেন, দয়া করে আপনার রেফারেন্স পোস্ট করুন

উত্তর:


157

os.pathএকটি মজার উপায়ে কাজ করে। দেখে মনে হচ্ছে osসাবমডিউল সহ একটি প্যাকেজ হওয়া উচিত path, তবে বাস্তবে osএকটি সাধারণ মডিউল যা sys.modulesইনজেকশনের সাথে যাদু করে os.path। যা ঘটে তা এখানে:

  • পাইথন শুরু হয়ে গেলে এটি মডিউলগুলির মধ্যে একটি গোছা লোড করে sys.modules। এগুলি আপনার স্ক্রিপ্টের কোনও নামের সাথে আবদ্ধ নয়, আপনি ইতিমধ্যে তৈরি মডিউলগুলি কোনও উপায়ে আমদানি করার সময় অ্যাক্সেস করতে পারবেন।

    • sys.modulesএকটি ডিক যা মডিউলগুলি ক্যাশে করা হয়। আপনি যখন কোনও মডিউল আমদানি করেন, যদি এটি ইতিমধ্যে অন্য কোথাও আমদানি করা হয় তবে এটি সঞ্চিত উদাহরণটি সঞ্চার করে sys.modules
  • osপাইথন শুরু হওয়ার পরে লোড হওয়া মডিউলগুলির মধ্যে একটি। এটি এর pathবৈশিষ্ট্যটি একটি ওএস-নির্দিষ্ট পাথ মডিউলকে বরাদ্দ করে ।

  • এটি sys.modules['os.path'] = pathএমনভাবে সংক্রামিত হয় যাতে আপনি " import os.path" করতে সক্ষম হলেন যেন এটি একটি সাবমডিউল।

আমি মনে ঝোঁক os.pathযেমন একটি মডিউল আমি ব্যবহার করতে চান পরিবর্তে একটি জিনিস osমডিউল , তাই যদিও এটা না সত্যিই একটি প্যাকেজ নামক একটি submodule os, আমি এটা সাজানোর মত এটা এক হয় আমদানি করবে এবং আমি সবসময় কিimport os.path । এটি কীভাবে os.pathনথিভুক্ত করা হয় তার সাথে সামঞ্জস্যপূর্ণ ।


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

  1. আপনি যদি osপ্যাকেজ হিসাবে ভাবেন এবং জানেন যে আপনি করতে পারেন import osএবং সাবমডিউলে অ্যাক্সেস রাখতে পারেন তবে os.pathআপনি পরে অবাক হতে পারেন import twistedএবং twisted.spreadআমদানি না করে স্বয়ংক্রিয়ভাবে অ্যাক্সেস করতে পারেন ।

  2. এটি বিভ্রান্তিকর যা os.nameএকটি সাধারণ জিনিস, একটি স্ট্রিং এবং os.pathএকটি মডিউল। আমি সর্বদা আমার প্যাকেজগুলি খালি __init__.pyফাইলগুলির সাথে কাঠামো করি যাতে একই স্তরে আমার সর্বদা এক ধরণের জিনিস থাকে: একটি মডিউল / প্যাকেজ বা অন্যান্য সামগ্রী। বেশ কয়েকটি বড় পাইথন প্রকল্পগুলি এই পদ্ধতি গ্রহণ করে যা আরও কাঠামোগত কোড তৈরি করে।


দুর্দান্ত, খুব তথ্যপূর্ণ উত্তর! অভিনন্দন! যদিও এটি সরাসরি প্রশ্নের উত্তর দেয় না, এতে প্রচুর দরকারী বিশদ রয়েছে। তবে আপনি কী দয়া করে "os.path নথিভুক্ত করা যায় তার সাথে এটি সামঞ্জস্যপূর্ণ"? ক্রিস হুলান যেমন বলেছিলেন, ওএসওয়াক () উদাহরণটি ওএসপথের পরিবর্তে কেবল ওএস আমদানি করে।
ডেনিলসন সা মিয়া

3
@ ডেনিলসন, এটির প্রত্যক্ষ উত্তর অন্তর্ভুক্ত রয়েছে: আমি সর্বদা নিজেকে import os.pathকরি এবং মনে করি এটি একটি দুর্দান্ত উপায়। দ্বারা "এভাবেই os.path নথিভুক্ত করা সঙ্গে সামঞ্জস্যপূর্ণ" আমি অর্থ ছিল এ ডকুমেন্টেশনে তার নিজস্ব পৃষ্ঠায় দেওয়া হয় docs.python.org/library/os.path.html
মাইক গ্রাহাম

1
বাহ, os.pyপ্রকৃতপক্ষে ইনজেকশন না sys.modules['os.path']। সুতরাং এটি কেন from os.path import somethingকাজ করে। আমি কখন উত্সাহটি পেয়েছিলাম এবং উত্সটি পরীক্ষা করা হয়েছিল তা সম্পর্কে। মজাদার ঘটনা: এটি ১৯৯৯ সালের, প্রথমটি পাইথন 1.5 1.5.2 এ অন্তর্ভুক্ত। আসল প্রতিশ্রুতি এখানে
ব্লুহর্ন

29

অনুযায়ী PEP-20 টিম পিটার্স দ্বারা, এবং "পঠনযোগ্যতার গন্য" "স্পষ্ট অন্তর্নিহিত বেশী ভালো"। সব তোমার কাছ থেকে প্রয়োজন osমডিউল বয়সী os.path, import os.pathঅনেক বেশী সুনিদৃষ্ট হতে হবে এবং আপনি কি সত্যিই যত্নশীল দিন হবে।

তেমনি, পিইপি -২০ এও বলেছে যে "জটিল থেকে সহজ সরল", সুতরাং আপনার যদি এমন সাধারণ osসামগ্রীর ছাতার নীচে থাকা জিনিসগুলিরও প্রয়োজন হয় import osতবে তা পছন্দ করা উচিত।


2
আমি দেখতে পাচ্ছি না যে import osকোনও অর্থবহ উপায়ে "সরল" হওয়া সম্পর্কে কীভাবে সত্য। সরল! = সংক্ষিপ্ত।
মাইক গ্রাহাম 21

14
আমি আরো উল্লেখ করেন যে চেষ্টা ছিল import os এবং একটি import os.pathআপনি যেমন প্রয়োজন হাবা হয় os.getcwd()এবংos.path.isfile()
নিক টি

15

সংক্ষিপ্ত উত্তর: import osএবং ব্যবহার করুন os.pathimport os.pathসরাসরি না ।

মডিউল নিজেই ডকুমেন্টেশন থেকে:

>>> import os
>>> help(os.path)
...
Instead of importing this module directly, import os and refer to
this module as os.path.  The "os.path" name is an alias for this
module on Posix systems; on other systems (e.g. Mac, Windows),
os.path provides the same operations in a manner specific to that
platform, and is an alias to another module (e.g. macpath, ntpath).
...

13
মনে রাখবেন যে, এটি একটি এর জন্য দস্তাবেজ নয় os.pathমডিউল যা বিদ্যমান নয়, কিন্তু posixpath
wRAR

18
এটি মোটেও নয় যে আমি কীভাবে অনুভব করি যে ডক্টরসিংকে বোঝানো হয়েছে, যদিও এটি বেশ বিভ্রান্তিকর। মনে রাখবেন যে বাক্যটি "Instead of importing this module directly, import os and refer to this module as os.path."অবস্থিত posixpath.py(বা macpath.py, ntpath.pyইত্যাদি)। আমি মোটামুটি নিশ্চিত যে তাদের অর্থ যা হ'ল তা না হওয়া উচিত import posixpath(যা কাজ করে), বরং osআরও ভাল বহনযোগ্যতার জন্য মডিউলটি আমদানি করে । আমি মনে করি না তারা কিনা একটি সুপারিশ দিতে মনস্থ না import osবা import os.pathপছন্দ করা হয়।
flornquake

1
আমি @ ফ্লোরকোইকের বেশিরভাগ মন্তব্যের সাথে একমত তবে শেষ বাক্যটির সাথে একমত নই। উভয়ই posixpath.py এবং ntpath.py বলে "আমদানি ওএস এবং এই মডিউলটিকে os.path হিসাবে উল্লেখ করুন"। তারা "আমদানি os.path" বলে না এবং এই মডিউলটিকে os.path হিসাবে উল্লেখ করে "। macpath.py এর বিষয়ে কিছুই নেই।
পিট ফরম্যান

3
এই পয়েন্টারযুক্ত নথিটি কীভাবে বিভ্রান্তিকর হতে পারে তা দেখানোর এটি একটি উত্তম উদাহরণ : ডি
সিকার

7

আকর্ষণীয় যথেষ্ট, ওএস.পথ আমদানি সমস্ত ওএস আমদানি করবে। ইন্টারেক্টিভ প্রম্পটে নিম্নলিখিত চেষ্টা করুন:

import os.path
dir(os)

ফলাফলটি একই রকম হবে যদি আপনি কেবল ওএস আমদানি করেন। এটি কারণ আপনার অপারেটিং সিস্টেমের উপর ভিত্তি করে ওএস.পথ একটি পৃথক মডিউল উল্লেখ করবে, সুতরাং পাইথনটি কোনও মডিউলটিকে পাথের জন্য লোড করতে হবে তা নির্ধারণ করতে ওএস আমদানি করবে।

উল্লেখ

কিছু মডিউল সহ, কথাটি প্রকাশিত import fooহবে না foo.bar, সুতরাং আমার ধারণা এটি সত্যই নির্দিষ্ট মডিউলটির নকশা নির্ভর করে।


সাধারণভাবে, আপনার প্রয়োজনীয় স্পষ্ট মডিউলগুলি আমদানি করা প্রান্তিক দ্রুত হওয়া উচিত। আমার মেশিনে:

import os.path: 7.54285810068e-06 সেকেন্ড

import os: 9.21904878972e-06 সেকেন্ড

মোটামুটি উপেক্ষিত হওয়ার জন্য এই সময়গুলি যথেষ্ট কাছে। আপনার প্রোগ্রামটি osএখন থেকে বা পরবর্তী সময়ে অন্য মডিউলগুলি ব্যবহার করার প্রয়োজন হতে পারে , তাই সাধারণত দুটি মাইক্রোসেকেন্ডকে ত্যাগ করতে এবং import osপরবর্তী সময়ে এই ত্রুটিটি এড়াতে ব্যবহার করা বোধগম্য হয় । আমি সাধারণত সামগ্রিকভাবে ওএস আমদানি করেই থাকি তবে কেন কেউ কেউ import os.pathপ্রযুক্তিগতভাবে আরও দক্ষ হতে এবং কোডটির পাঠকদের কাছে জানাতে চান তা বুঝতে পারি osযে এটি মডিউলটির একমাত্র অংশ যা ব্যবহার করা প্রয়োজন। এটি মূলত আমার মনে একটি স্টাইল প্রশ্নে ফোটে।


2
from os import pathগতি যদি সমস্যা হয় তবে কলগুলিকে আরও দ্রুততর করে তুলবে।
জাস্টিন পিল

পাইথোনিক হওয়ার কারণে, স্পষ্টতই প্রকৃত অধিকারের চেয়ে ভাল? বাস্তবে আমি মনে করি এটি ব্যবহারকারীর দ্বারা রায়টি কলটি আসলেই OS এর মধ্যে কেবল os.path বা একাধিক মডিউল ব্যবহার করছে কিনা। আপনার একটি দর্শনের সাথে অন্য একটি পদ্ধতির সাথে সামঞ্জস্য থাকতে পারে?
অ্যান্ড্রু কউ

23
এই সময়টি হ'ল আমি আগে দেখা কিছু অকালপূর্ব অপটিমাইজেশন। এই হয়েছে না কারো বোতলের এবং সময় কীভাবে কেউ কোড উচিত অশরীরী হয়।
মাইক গ্রাহাম 21

5

সাধারণ জ্ঞান এখানে কাজ করে: osএকটি মডিউল এবং os.pathএটি একটি মডিউলও। সুতরাং আপনি যে মডিউলটি ব্যবহার করতে চান তা কেবল আমদানি করুন:

  • আপনি যদি osমডিউলটিতে কার্যকারিতা ব্যবহার করতে চান তবে আমদানি করুন os

  • আপনি যদি os.pathমডিউলটিতে কার্যকারিতা ব্যবহার করতে চান তবে আমদানি করুন os.path

  • আপনি যদি উভয় মডিউলে কার্যকারিতা ব্যবহার করতে চান তবে উভয় মডিউল আমদানি করুন:

    import os
    import os.path

রেফারেন্সের জন্য:


4

কোনো নির্ধারক রেফারেন্স খুঁজে পাওয়া যায়নি, কিন্তু আমি দেখছি উদাহরণস্বরূপ কোড os.walk ব্যবহারসমূহ os.path কিন্তু শুধুমাত্র আমদানির OS

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