بايثون:تغيير النصوص دليل العمل إلى النص نفسه دليل

StackOverflow https://stackoverflow.com/questions/1432924

  •  07-07-2019
  •  | 
  •  

سؤال

أنا تشغيل الثعبان قذيفة من crontab كل دقيقة:

* * * * * /home/udi/foo/bar.py

/home/udi/foo لديه بعض الدلائل مثل /home/udi/foo/log و /home/udi/foo/config, ، /home/udi/foo/bar.py يشير إلى.

المشكلة هي أن crontab تشغيل البرنامج النصي من دليل العمل ، لذلك تحاول فتح ./log/bar.log يفشل.

هل هناك طريقة لطيفة أن أقول السيناريو إلى تغيير دليل العمل إلى النص نفسه الدليل ؟ وأود أن يتوهم حل من شأنه أن يعمل على أي سكربت الموقع, بدلا من صراحة أقول السيناريو حيث هو.

تحرير:

os.chdir(os.path.dirname(sys.argv[0]))

كان الاتفاق الأكثر أناقة الحل.شكرا على الإجابات والتفسيرات!

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

المحلول

هذا سوف تغيير دليل العمل الحالي حتى فتح المسارات النسبية سوف تعمل:

import os
os.chdir("/home/udi/foo")

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

import os

abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)

يأخذ هذا الملف من البرنامج النصي الخاص بك ، وتحولها إلى مسار مطلق ، ثم استخراج الدليل من هذا الطريق ، ثم التغييرات في هذا الدليل.

نصائح أخرى

يمكنك الحصول على نسخة أقصر طريق استخدام sys.path[0].

os.chdir(sys.path[0])

من http://docs.python.org/library/sys.html#sys.path

كما تمت تهيئته على برنامج بدء التشغيل ، البند الأول من هذه القائمة ، path[0], هو الدليل الذي يحتوي على البرنامج النصي الذي تم استخدامه استدعاء مترجم بايثون

لا تفعل هذا.

البرامج النصية الخاصة بك والبيانات الخاصة بك لا ينبغي أن يكون المهروسة إلى دليل.وضع الكود الخاص بك في مكان معروف (site-packages أو /var/opt/udi أو شيء) منفصلة من البيانات الخاصة بك.استخدام نسخة جيدة التحكم في التعليمات البرمجية الخاصة بك للتأكد من أن لديك الحالية الإصدارات السابقة فصلها عن بعضها البعض بحيث يمكنك العودة إلى الإصدارات السابقة واختبار الإصدارات المستقبلية.

خلاصة القول:لا تختلط التعليمات البرمجية والبيانات.

البيانات الثمينة.رمز يأتي ويذهب.

توفير دليل العمل بوصفها وسيطة سطر الأوامر القيمة.يمكنك توفير الافتراضي باعتبارها متغير البيئة.لا نستنتج من ذلك (أو تخمين في ذلك)

جعله المطلوبة الحجة قيمة تفعل هذا.

import sys
import os
working= os.environ.get("WORKING_DIRECTORY","/some/default")
if len(sys.argv) > 1: working = sys.argv[1]
os.chdir( working )

لا "تحمل" الدليل استنادا إلى موقع البرنامج.فإنه لن ينجح على المدى الطويل.

تغيير إعدادات crontab الأمر

* * * * * (cd /home/udi/foo/ || exit 1; ./bar.py)

على (...) يبدأ شل الفرعية التي crond ينفذ كما أمر واحد.على || exit 1 يسبب cronjob أن تفشل في حالة أن الدليل غير متوفر.

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

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