سؤال

قل هناك مجلد "/ الصفحة الرئيسية / المستخدم / TEMP / A40BD22344". الاسم عشوائي تماما وتغييرات في كل التكرار. أحتاج إلى أن أكون قادرا على استيراد هذا المجلد في Python باستخدام اسم ثابت، قل "المشروع". أعلم أنه يمكنني إضافة هذا المجلد إلى sys.path لتمكين البحث عن استيراد، ولكن هل هناك طريقة لاستبدال "A40BD2344" مع "المشروع"؟

ربما بعض الخارقة الذكية في فيه.السنة التحضيرية؟

وأضاف:

يجب أن تكون عالميا - أي إعداد البرامج النصية الأخرى "مشروع" عبر المعيار:

import project

يجب أن تعمل بشكل صحيح، قم بتحميل A40BD22344 بدلا من ذلك.

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

المحلول

يمكنك استيرادها أولا يستورد:

>>> __import__('temp/a40bd22344')
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>

ثم تأكد من أن هذه الوحدة تعلن أنها بايثون project:

>>> import sys
>>> sys.modules['project'] = sys.modules.pop('temp/a40bd22344')

بعد ذلك، سيحصل أي شيء استيراد المشروع في جلسة Python الحالية على الوحدة الأصلية

>>> import project
>>> project
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>

سيعمل ذلك أيضا على الوحدات الفرعية: إذا كان لديك foobar.py في نفس الموقع، فستحصل عليه

>>> import project.foobar
>>> project.foobar
<module 'project.foobar' from 'temp/a40bd22344/foobar.py'>

إضافة. إليك ما أركضه:

>>> print sys.version
2.5.2 (r252:60911, Jul 31 2008, 17:28:52) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]

نصائح أخرى

إليك طريقة واحدة للقيام بذلك، دون لمس sys.Path، باستخدام imp الوحدة في بيثون:

import imp

f, filename, desc = imp.find_module('a40bd22344', ['/home/user/temp/'])
project = imp.load_module('a40bd22344', f, filename, desc)

project.some_func()

هنا رابط لبعض الوثائق الجيدة على imp وحدة:

بالتأكيد، project = __import__('a40bd22344') بعد sys.path يتم تعيين بشكل صحيح سوف تعمل فقط.

افترض أنك تريد أن تفعل ذلك في وظيفة تأخذ المسار الكامل كوسيطة وإعداد عالمي استيراد project بشكل صحيح (وكذلك صنع سحرية import project العمل بعد ذلك في وحدات أخرى). قطعة من الكعك:

def weirdimport(fullpath):
  global project

  import os
  import sys
  sys.path.append(os.path.dirname(fullpath))
  try:
      project = __import__(os.path.basename(fullpath))
      sys.modules['project'] = project
  finally:
      del sys.path[-1]

هذا يترك أيضا sys.Path كما وجدته.

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