بايثون:execfile من الملفات الأخرى العاملة الدليل ؟

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

سؤال

لدي بعض التعليمات البرمجية التي يقوم بتحميل ملف التكوين الافتراضي ثم يسمح للمستخدمين التوريد الخاصة بهم الثعبان ملفات إضافية تكميلية التكوين أو تجاوزات من التخلف:

# foo.py

def load(cfg_path=None):
    # load default configuration
    exec(default_config)

    # load user-specific configuration
    if cfg_path:
        execfile(cfg_path)

هناك مشكلة ، على الرغم من: execfile() ينفذ الأوامر في الملف المحدد من قبل cfg_path كما لو كان في دليل العمل من foo.py, لا تملك دليل العمل.وهكذا ، import توجيهات قد تفشل إذا cfg_path الملف لا أقول ، from m import x حيث m هو وحدة في نفس الدليل كما cfg_path.

كيف execfile() من دليل العمل من حجة ، أو تحقيق معادلة النتيجة ؟ أيضا, لقد قيل لي أن execfile هو مستنكر في بيثون 3 و التي يجب أن تكون باستخدام exec, إذا كان هناك طريقة أفضل من أن لا ينبغي أن تفعل هذا, أنا كل آذان.

ملاحظة: لا أعتقد أن الحلول التي مجرد تغيير دليل العمل الصحيح.التي لن تضع تلك الوحدات على المترجم وحدة بحث المسار ، بقدر ما استطيع ان اقول.

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

المحلول

نظام التشغيل.تشدر يتيح لك تغيير دليل العمل كما يحلو لك (يمكنك استخراج دليل العمل من cfg_path مع os.path.dirname);تأكد أولا من الحصول على الدليل الحالي مع نظام التشغيل.getcwd إذا كنت ترغب في استعادته عند الانتهاء exec جي cfg_path.

بيثون 3 لا بل إزالة execfile (لصالح تسلسل حيث يمكنك قراءة الملف ، compile محتويات ، ثم exec منهم), ولكن كنت لا داعي للقلق حول ذلك ، إذا كنت حاليا الترميز في بيثون 2.6 منذ 2to3 مصدر إلى مصدر الترجمة يتعامل مع كل هذا بسلاسة.

تحرير:OP يقول في التعليق ، execfile تطلق عملية منفصلة ولا تحترم دليل العمل الحالي.هذا غير صحيح و هنا مثال يوضح ذلك هو:

import os

def makeascript(where):
  f = open(where, 'w')
  f.write('import os\nprint "Dir in file:", os.getcwd()\n')
  f.close()

def main():
  where = '/tmp/bah.py'
  makeascript(where)
  execfile(where)
  os.chdir('/tmp')
  execfile(where)

if __name__ == '__main__':
  main()

يعمل هذا على آلة تنتج الإخراج مثل:

Dir in file: /Users/aleax/stko
Dir in file: /private/tmp

والتي تبين بوضوح أن execfile لا الاستمرار في استخدام دليل العمل التي وضعت في ذلك الوقت execfile ينفذ.(إذا كان الملف تنفيذ التغييرات دليل العمل ، من شأنها أن تنعكس بعد execfile يعود-بالضبط لأن كل شيء هو تجري في نفس العملية!).

لذا مهما كانت المشاكل العملية لا تزال هي مراقبة لا مرتبطة دليل العمل الحالي (من الصعب تشخيص ما قد يكون في الواقع ، دون رؤية رمز التفاصيل الدقيقة لوحظ المشاكل؛ -).

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