بايثون:execfile من الملفات الأخرى العاملة الدليل ؟
-
06-07-2019 - |
سؤال
لدي بعض التعليمات البرمجية التي يقوم بتحميل ملف التكوين الافتراضي ثم يسمح للمستخدمين التوريد الخاصة بهم الثعبان ملفات إضافية تكميلية التكوين أو تجاوزات من التخلف:
# 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
يعود-بالضبط لأن كل شيء هو تجري في نفس العملية!).
لذا مهما كانت المشاكل العملية لا تزال هي مراقبة لا مرتبطة دليل العمل الحالي (من الصعب تشخيص ما قد يكون في الواقع ، دون رؤية رمز التفاصيل الدقيقة لوحظ المشاكل؛ -).