سؤال

هل يمكن لجميع المسارات في برنامج بايثون استخدام ".." (للدليل الأصلي) و/ (لفصل مكونات المسار)، وما زالت تعمل مهما كانت المنصة?

من ناحية، لم أر قط مثل هذا الادعاء في الوثائق (ربما فاتني)، وتوفر وحدات os وos.path تسهيلات للتعامل مع المسارات بطريقة لا تعتمد على النظام الأساسي (os.pardir، os.path. انضم،...) مما يجعلني أعتقد أنهم هنا لسبب ما.

من ناحية أخرى، يمكنك اقرأ على StackOverflow أن "../path/to/file" يعمل على جميع الأنظمة الأساسية...

لذا، هل يجب دائمًا استخدام os.pardir وos.path.join والأصدقاء لأغراض قابلية النقل، أم أن أسماء مسارات Unix آمنة دائمًا (حتى مشاكل ترميز الأحرف المحتملة)؟أو ربما يكون آمنًا "دائمًا تقريبًا" (أي.العمل تحت أنظمة التشغيل Windows وOS X وLinux)؟

هل كانت مفيدة؟

المحلول

و"دائما تقريبا آمنة" هو الحق. كل من منصات يهمك ربما عمل طيب اليوم وأنا لا أعتقد أنهم سيتم تغيير اتفاقياتها في أي وقت قريب.

ولكن بيثون هو محمول للغاية ويعمل على أكثر بكثير من منصات المعتادة. والسبب في وحدة os هو للمساعدة في الأمور سلسة أكثر من ذلك منبرا لديه متطلبات مختلفة.

هل هناك سبب جيد بالنسبة لك لعدم استخدام وظائف os؟

وos.pardir هو توثيق الذاتي في حين ليس ".."، وos.pardir قد يكون من الأسهل على البقرى ل

وهنا بعض المستندات من الثعبان 1.6 عندما كان ماك لا يزال مختلفا في كل شيء

<اقتباس فقرة>   

والروتين OS لنظام التشغيل Mac، DOS، NT، أو POSIX اعتمادا على ما هو نظام نحن   على.

     

وهذه الصادرات:     - جميع وظائف من POSIX، الإقليم الشمالي، دوس، OS2، ماك، أو م، على سبيل المثال إلغاء الربط، والقانون الأساسي، الخ     - os.path هي واحدة من وحدات posixpath، ntpath، macpath، أو dospath     - os.name هو 'POSIX'، 'الشمالي'، 'دوس'، 'OS2'، 'ماك'، أو 'م'     - os.curdir هو سلسلة تمثل الدليل الحالي (أو ':' '.')     - os.pardir هو سلسلة تمثل الدليل الأصل ( '..' أو '::')     - os.sep هو (أو الأكثر شيوعا) مسار فاصل ( '/' أو ':' أو '\')     - os.altsep هو فاصل مسار بديل (بلا أو '/')     - os.pathsep هو فاصل مكون المستخدمة في $ PATH الخ     - os.linesep هو خط فاصل في ملفات نصية ( '' أو '' أو '')     - os.defpath هو البحث المسار الافتراضي لالتنفيذية

     

والبرامج التي استيراد واستخدام "نظام التشغيل" تقف فرصة أفضل لل   المحمولة بين منصات مختلفة. بالطبع، يجب عليهم عندئذ فقط   وظائف استخدام التي تم تعريفها من قبل جميع المنصات (على سبيل المثال، إلغاء و   opendir)، وترك كل التلاعب مسار لos.path (على سبيل المثال، والانقسام   والانضمام).

نصائح أخرى

وأنا لم أصب أي مشاكل مع استخدام ..، على الرغم من أنه قد يكون فكرة جيدة لتحويله إلى مسار مطلق باستخدام <لأ href = "http://docs.python.org/library/os.path. أتش تي أم أل # os.path.abspath "يختلط =" noreferrer "> os.path.abspath . ثانيا، أود أن أوصي دائما باستخدام os.path.join أينما أمكن ذلك. وهناك الكثير من الحالات ركنية (وبصرف النظر عن القضايا قابلية) في الانضمام المسارات، وأنه من الجيد ليس لديهم ما يدعو للقلق لهم. على سبيل المثال:

>>> '/foo/bar/' + 'qux'
'/foo/bar/qux'
>>> '/foo/bar' + 'qux'
'/foo/barqux'
>>> from os.path import join
>>> join('/foo/bar/', 'qux')
'/foo/bar/qux'
>>> join('/foo/bar', 'qux')
'/foo/bar/qux'

وأنت قد واجهت مشاكل مع استخدام .. إذا كنت على بعض المنابر غامضة، ولكن لا يمكنني تسمية أي (ويندوز، * لا شىء، وOS X عن دعم هذا التدوين).

وضمن الثعبان، وذلك باستخدام / ستعمل دائما. سوف تحتاج إلى أن يكون على بينة من اتفاقية OS إذا كنت ترغب في تنفيذ أمر في المستوى الفرعي

myprog = "/path/to/my/program"
os.system([myprog, "-n"])                           # 1
os.system([myprog, "C:/input/file/to/myprog"])      # 2

وسوف قيادة # 1 ربما يعمل كما هو متوقع.
القيادة رقم 2 قد لا تعمل إذا myprog هو أمر ويندوز، ويتوقع أن تحليل الحجج سطر الأوامر الخاصة به للحصول على اسم ملف ويندوز.

ويعمل على ويندوز، لذلك إذا قمت بتعريف "مهما كانت منصة" ليكون ويندوز ويونيكس، وكنت على ما يرام.

من ناحية أخرى، ويدير بيثون أيضا على VMS، RISC OS، وغيرها من منصات الغريب أن استخدام الاتفاقيات اسم الملف مختلفة تماما. ومع ذلك، فمن المحتمل أن تحاول الحصول على التطبيق الخاص بك لتشغيل على VMS، أعمى، هو نوع من سخيفة على أي حال - "قابلية المبكرة هو جذر بعض الشر طفيفة نسبيا"

وأنا أحب استخدام وظائف os.path على أي حال لأنها جيدة للتعبير عن نية - بدلا من مجرد سلسلة السلسلة، والذي يمكن القيام به لأي من مليون الأغراض، فإنه يقرأ بشكل واضح جدا كما التلاعب مسار

يدعم ويندوز / كفاصل المسار.حالات عدم التوافق الوحيدة بين أسماء ملفات Unix وأسماء ملفات Windows هي:

  • الأحرف المسموح بها في أسماء الملفات
  • الأسماء الخاصة و
  • حساسية القضية

Windows أكثر تقييدًا في الحسابين الأولين (أي أنه يحتوي على المزيد من الأحرف المحظورة والمزيد من الأسماء الخاصة)، في حين أن Unix عادةً ما يكون حساسًا لحالة الأحرف.هناك بعض إجابات هنا أدرج بالضبط ما هي هذه الشخصيات والأسماء.سأرى إذا كان بإمكاني العثور عليهم.

الآن، إذا كانت بيئة التطوير لديك مزودة بوظيفة لإنشاء المسارات أو معالجتها، فيجب عليك استخدامها، فهي موجودة لسبب ما، كما تعلم.خاصة وأن هناك منصات أكثر بكثير من Windows و Unix.

الإجابة على سؤالك الأول، نعم ../dir/file سوف تعمل، ما لم تصل إلى بعض حالات عدم التوافق المذكورة أعلاه.

وOS / X و Linux كلاهما يونكس متوافقة، وذلك عن طريق تعريف يستخدمون الشكل الذي قدم في بداية السؤال. ويندوز يسمح "/" بالإضافة إلى "\" بحيث برامج يمكن أن تكون قابلة للتبديل مع زينويكس، وهو البديل يونكس أن مايكروسوفت كانت تحاول الخروج منذ وقت طويل، وقد تم تنفيذ هذا التوافق إلى الأمام حتى الوقت الحاضر. وبالتالي فإنه يعمل أيضا.

وأنا لا أعرف كم عدد منصات أخرى وقد استدار بيثون، وأنا لا أستطيع أن أتكلم بالنسبة لهم.

وكما قال آخرون، وعلى خط مائل العمل في جميع الحالات، ولكن كنت أفضل حالا إنشاء قائمة من شرائح المسار وos.path.join () - جي منهم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top