كيفية استيراد وحدة نمطية من دليل على مستوى أعلى من البرنامج النصي الحالي

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

  •  05-07-2019
  •  | 
  •  

سؤال

بالنسبة لتطبيق Python الخاص بي، لدي بنية الدلائل التالية:

\myapp
\myapp\utils\
\myapp\utils\GChartWrapper\
\myapp\model\
\myapp\view\
\myapp\controller\

يجب على أحد فصولي في \myapp\view\ استيراد فئة تسمى GChartWrapper.لكن يظهر لي خطأ في الاستيراد...

myview.py
from myapp.utils.GChartWrapper import *

وهنا الخطأ:

<type 'exceptions.ImportError'>: No module named GChartWrapper.GChart
      args = ('No module named GChartWrapper.GChart',)
      message = 'No module named GChartWrapper.GChart' 

ما الخطأ الذي افعله؟أواجه صعوبة حقًا في استيراد الوحدات/الفصول الدراسية في Python ...

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

المحلول

ملف __init__.py من حزمة GChartWrapper تتوقع حزمة GChartWrapper على PYTHONPATH. يمكن أن أقول لكم من السطر الأول:

from GChartWrapper.GChart import *

هل من الضروري أن يكون تضمنت GChartWrapper الحزمة في بنية الدليل مجموعتك؟ إذا كان الأمر كذلك، ثم هناك شيء واحد يمكن القيام به هو إضافة المسار حيث يقيم الحزمة إلى sys.path في وقت التشغيل. أنا أعتبر myview.py في الدليل myapp\view؟ ثم هل يمكن القيام بذلك قبل استيراد GChartWrapper:

import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'utils')))

إذا أنه ليس من الضروري أن يكون ذلك في بنية الدليل الخاص بك، فإنه يمكن أن يكون أسهل أن يكون ذلك مثبتا في الموقع التقليدي. يمكنك القيام بذلك عن طريق تشغيل البرنامج النصي setup.py الذي تم تضمينه في توزيع مصدر GChartWrapper.

نصائح أخرى

لا يمكنك استيراد الوحدات والحزم من المسارات التعسفية.بدلاً من ذلك، في بايثون تستخدم الحزم والواردات المطلقة.وهذا سوف يتجنب كل المشاكل المستقبلية.

مثال:

قم بإنشاء الملفات التالية:

MyApp\myapp\__init__.py
MyApp\myapp\utils\__init__.py
MyApp\myapp\utils\charts.py
MyApp\myapp\model\__init__.py
MyApp\myapp\view\__init__.py
MyApp\myapp\controller\__init__.py
MyApp\run.py
MyApp\setup.py
MyApp\README

يجب أن تكون الملفات فارغة باستثناء تلك:

MyApp\myapp\utils\charts.py:

class GChartWrapper(object):
    def __init__(self):
        print "DEBUG: An instance of GChartWrapper is being created!"

MyApp\myapp\view\__init__.py:

from myapp.utils.charts import GChartWrapper

def start():
    c = GChartWrapper() # creating instance of the class

MyApp\run.py:

from myapp.view import start
start()

هذا كل شئ!عند تشغيل نقطة الدخول الخاصة بك (run.py) فإنه يستدعي دالة في العرض، ويقوم بإنشاء مثيل لفئة GChartWrapper.باستخدام هذا الهيكل يمكنك استيراد أي شيء في أي مكان واستخدامه.

لتكملة، في MyApp\setup.py تكتب برنامج تثبيت لحزمة MyApp\myapp.يستخدم com.distutils لكتابتها:

from distutils.core import setup
setup(name='MyApp',
      version='1.0',
      description='My Beautiful Application',
      author='Martin',
      author_email='martin@xxxxxxx.com',
      url='http://stackoverflow.com/questions/1003843/',
      packages=['myapp'],
      scripts=['run.py']
     )

هذا يكفي.الآن عندما يقوم الأشخاص بتنزيل مجلد MyApp، يمكنهم فقط تثبيته باستخدام setup.py وتشغيله باستخدام run.py.يمكن لـ Distutils إنشاء حزم بعدد من التنسيقات بما في ذلك Windows القابل للتثبيت .EXE

إنها الطريقة القياسية لتوزيع حزم/تطبيقات بايثون.

ويمكنك تغيير المسار حيث يبدو الثعبان لملفات.

في الجزء العلوي من الملف المصدر، إضافة:

import sys
sys.path.append("..") 

وأو بدلا من تغيير متغير البيئة:

export PYTHONPATH=..

وأو البدء في بيثون 2.5 (مرة أخرى افتراض MYVIEW في اسم التطبيق \ عرض:

from __future__ import absolute_import
from ..utils.GChartWrapper import *

وانظر: HTTP: // مستندات .python.org / whatsnew / 2.5.html # الحماسي-328-مطلق ونسبي واردات

وGChartWrapper يتوفر أيضا من PyPI بحيث يمكنك استخدام easy_install أو نقطة لتثبيت وحدة نمطية:

sudo pip install GChartWrapper==0.9

وبعد ذلك سوف تضاف آليا إلى PYTHONPATH الخاص بك وبعد ذلك يمكنك إزالته من / اسم التطبيق / دليل تيلس الخاص بك. إذا كنت لا تستطيع استخدام سودو، والنظر في استخدام virtualenv (وvirtualenvwrapper).

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