পাইথনকে আলাদা ফোল্ডার থেকে আমদানি করতে পারি না


90

সাব-ফোল্ডারে পাইথনকে মডিউলটি আমদানি করার মতো মনে হচ্ছে না। আমি আমদানি করা মডিউল থেকে শ্রেণীর উদাহরণ তৈরি করার চেষ্টা করলে ত্রুটিটি পাই তবে আমদানি নিজেই সফল হয়। এখানে আমার ডিরেক্টরি কাঠামো:

Server
    -server.py
    -Models
        --user.py

সার্ভার.পি এর সামগ্রীগুলি এখানে:

from sys import path
from os import getcwd
path.append(getcwd() + "\\models") #Yes, i'm on windows
print path
import user

u=user.User() #error on this line

এবং ইউজার.পি:

class User(Entity):
    using_options(tablename='users')

    username = Field(String(15))
    password = Field(String(64))
    email    = Field(String(50))
    status   = Field(Integer)
    created  = Field(DateTime)

ত্রুটিটি হ'ল: অ্যাট্রিবিউটআরার: 'মডিউল' অবজেক্টটির কোনও বৈশিষ্ট্য নেই 'ব্যবহারকারী'


4
আপনি ত্রুটি বার্তা পেস্ট করতে পারেন?
হার্লি হলক্বে

ব্যবহারকারীর থেকে থাকলে, আমি সার্ভার.পিটি আমদানি করতে চাই। আমি কি করব?
চন্দ্র কাঁথ

উত্তর:


142

আমি বিশ্বাস করি যে আপনাকে __init__.pyমডেল ডিরেক্টরিতে ডাকা একটি ফাইল তৈরি করতে হবে যাতে পাইথন এটিটিকে মডিউল হিসাবে বিবেচনা করে।

তারপরে আপনি এটি করতে পারেন:

from Models.user import User

আপনি কোডটিতে অন্তর্ভুক্ত করতে পারেন __init__.py(উদাহরণস্বরূপ কোডটি যা কয়েকটি কয়েকটি পৃথক শ্রেণীর প্রয়োজন) বা এটিকে ফাঁকা রেখে দিতে পারেন। তবে এটি অবশ্যই সেখানে থাকা উচিত।


4
ধন্যবাদ, আমি এর আগে প্যাকেজগুলির কথা কখনও শুনিনি।
রাইগুয়ে

4
আসলে, পাইথন আমদানি করার সময় blah.py এবং blah / __ init__.py ঠিক একই রকম আচরণ করে।
পাই

4
যে unobvious ছিল ... আর আমি মনে মনে বলে, RTFM FMF
Alexander.Iljushkin

4
মনে রাখবেন যে আপনি অন্য ডিরেক্টরি থেকে সার্ভার.পি চালাচ্ছেন তবে এটি কাজ করবে না।
kchoi

4
সার্ভার.পি অন্য ফোল্ডারে থাকলে কী হবে?
ম্যান্ড্রয়েড

24

আপনাকে সাবফোল্ডারে তৈরি করতে __init__.pyহবে Models। ফাইলটি খালি থাকতে পারে। এটি একটি প্যাকেজ সংজ্ঞায়িত করে।

তারপরে আপনি এটি করতে পারেন:

from Models.user import User

পাইথন টিউটোরিয়াল-এ এটা সম্পর্কে সব পড়ুন, এখানে

পাইথন প্রকল্পগুলির ফাইল সংগঠন সম্পর্কে একটি ভাল নিবন্ধও রয়েছে


ফাইলটি খালি না হলে কী হবে?
অন্ধকার

12

আমদানি ব্যবহারকারী

u = user.User () # এই লাইনে ত্রুটি

উপরে উল্লিখিত __init__ এর অভাবের কারণে আপনি এমন একটি ImportError আশা করবেন যা সমস্যাটি আরও পরিষ্কার করে দেবে।

আপনি একটি পাবেন না কারণ 'ব্যবহারকারী' মানক লাইব্রেরিতে একটি বিদ্যমান মডিউলও। আপনার আমদানি বিবৃতিটি এটি ধরে ফেলে এবং এর ভিতরে থাকা ব্যবহারকারী শ্রেণীর সন্ধান করার চেষ্টা করে; এটি বিদ্যমান নেই এবং কেবল তখনই আপনি ত্রুটি পান।

আপনার আমদানি নিখুঁত করা সাধারণত একটি ভাল ধারণা:

import Server.Models.user

এই ধরণের অস্পষ্টতা এড়াতে প্রকৃতপক্ষে পাইথন ২. 'থেকে' আমদানি ব্যবহারকারীর 'বর্তমান মডিউলের তুলনায় মোটামুটি দেখাবে না।

আপনি যদি সত্যিই আপেক্ষিক আমদানি করতে চান তবে পাইথন ২.৫ এ কিছুটা কুৎসিত বাক্য গঠন ব্যবহার করে আপনি সেগুলি স্পষ্টভাবে রাখতে পারেন:

from .user import User

9

প্যারেন্ট ফোল্ডারে অবস্থিত একটি মডিউল আমদানির সঠিক উপায়, যখন আপনার কোনও মানক প্যাকেজ কাঠামো নেই:

import os, sys
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(CURRENT_DIR))

(আপনি শেষ দুটি লাইন একীভূত করতে পারেন তবে এই উপায়টি বোঝা সহজ)।

এই সমাধানটি ক্রস-প্ল্যাটফর্ম এবং এটি অন্যান্য পরিস্থিতিতে সংশোধন করার প্রয়োজন পর্যাপ্ত সাধারণ।


7

আপনি __init__.py মিস করছেন। পাইথন টিউটোরিয়াল থেকে:

পাইথনকে ডিরেক্টরিগুলি প্যাকেজযুক্ত হিসাবে বিবেচনা করার জন্য __init__.py ফাইলগুলি প্রয়োজন; স্ট্রিংয়ের মতো একটি সাধারণ নাম সহ ডিরেক্টরিগুলি অনিচ্ছাকৃতভাবে মডিউল অনুসন্ধানের পথে পরে আসা বৈধ মডিউলগুলি আড়াল করা থেকে করা যায় done সবচেয়ে সহজ ক্ষেত্রে, __init__.py কেবল একটি খালি ফাইল হতে পারে তবে এটি প্যাকেজের জন্য আরম্ভকরণ কোডটি কার্যকর করতে পারে বা পরে বর্ণিত __all__ ভেরিয়েবল সেট করতে পারে।

আপনার মডেল ডিরেক্টরিতে __init__.py নামে একটি খালি ফাইল রাখুন এবং সবগুলি সোনালি হওয়া উচিত।


1

আপনি কীভাবে প্যারামিটারগুলি লিখবেন os.path.dirname.... কমান্ড?

import os, sys
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(CURRENT_DIR))

0

আমার পছন্দের উপায়টি হ'ল প্রতিটি ডিরেক্টরিতে __init__.py থাকা মডিউলগুলি রয়েছে যা অন্যান্য মডিউল দ্বারা ব্যবহৃত হয় এবং এন্ট্রি পয়েন্টে sys.path কে নীচে হিসাবে ওভাররাইড করে:

def get_path(ss):
  return os.path.join(os.path.dirname(__file__), ss)
sys.path += [
  get_path('Server'), 
  get_path('Models')
]

এটি নির্দিষ্ট ডিরেক্টরিগুলিতে থাকা ফাইলগুলিকে আমদানির জন্য দৃশ্যমান করে তোলে এবং আমি সার্ভার.পি থেকে ব্যবহারকারী আমদানি করতে পারি।


0

উপরের এই অবদানকারীদের দেওয়া উত্তরগুলি দেখার পরে - জর্গলুব 29, টম, মার্ক, অ্যারন ম্যাকমিলিন, লুকাসামারাল, জোয়েজাও, কেজেল্ড ফ্লারুপ, প্রোসাইক্লিনসুর, মার্টিন.জেনকার, টুটি 44 এবং যে সমস্যার মুখোমুখি হয়েছি সেটিকে ডিবেগ করার কারণে আমি একটি ভিন্ন ব্যবহারের কারণ খুঁজে পেয়েছি due যা আমি এই সমস্যার মুখোমুখি ছিল। সুতরাং কারও উল্লেখের জন্য নীচে আমার পর্যবেক্ষণগুলি যুক্ত করুন

আমার কোডে আমার ক্লাসের একটি চক্রীয় আমদানি ছিল। উদাহরণ স্বরূপ:

src
 |-- utilities.py (has Utilities class that uses Event class)  
 |-- consume_utilities.py (has Event class that uses Utilities class)
 |-- tests
      |-- test_consume_utilities.py (executes test cases that involves Event class)

আমি টেস্ট ইউটিলিটি.পি -তে লিখিত ইউটিগুলি চালানোর জন্য পাইথন-এম পাইস্টেস্ট পরীক্ষা / টেস্ট_উটিলিটিস.পি চালানোর চেষ্টা করার সময় আমি নিম্নলিখিত ত্রুটি পেয়েছি ।

ImportError while importing test module '/Users/.../src/tests/test_utilities.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_utilities.py:1: in <module>
    from utilities import Utilities
...
...
E   ImportError: cannot import name 'Utilities'

আমি যেভাবে ত্রুটিটি সমাধান করেছি তা ছিল আমার কোডটিকে চক্রীয় আমদানি শ্রেণিতে কার্যকারিতা সরিয়ে ফ্যাক্টর করে যাতে আমি ক্লাসগুলির চক্রীয় আমদানি সরাতে পারি।

দ্রষ্টব্য, আমার __init__.pyআমার ' src ' ফোল্ডারে ফাইল রয়েছে পাশাপাশি ' পরীক্ষাগুলি ' ফোল্ডারে এবং এখনও কোডটি পুনরায় ফ্যাক্টর করে ' ইম্পোর্টেরর ' থেকে মুক্তি পেতে সক্ষম হয়েছি

নিম্নলিখিত স্ট্যাকওভারফ্লো লিঙ্কটি পাইথনের সার্কুলার নির্ভরতার উপর আরও অনেক বিশদ সরবরাহ করে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.