প্রকারের ত্রুটি: 'মডিউল' অবজেক্ট কলযোগ্য নয়


543
File "C:\Users\Administrator\Documents\Mibot\oops\blinkserv.py", line 82, in __init__
    self.serv = socket(AF_INET,SOCK_STREAM)
TypeError: 'module' object is not callable

আমি কেন এই ত্রুটি পাচ্ছি? আমি বিভ্রান্ত

আমার প্রশ্নের উত্তর দেওয়ার জন্য আপনার কী জানা দরকার?


8
আমি একবারে এই ত্রুটিটি পেয়েছি কারণ আমার দুটি (বৈশ্বিক) পরিবর্তনশীল এবং একই নামের একটি ফাংশন ছিল।
রিমাস্টটা

উত্তর:


562

socketক্লাস সমেত একটি মডিউল socket

আপনার করতে হবে socket.socket(...)বা from socket import socket:

>>> import socket
>>> socket
<module 'socket' from 'C:\Python27\lib\socket.pyc'>
>>> socket.socket
<class 'socket._socketobject'>
>>>
>>> from socket import socket
>>> socket
<class 'socket._socketobject'>

ত্রুটি বার্তার অর্থ
এটি : এটি বলে module object is not callable, কারণ আপনার কোডটি একটি মডিউল অবজেক্টকে কল করছে । একটি মডিউল অবজেক্ট হ'ল ধরণের জিনিস আপনি যখন মডিউলটি আমদানি করেন আপনি পান। আপনি যা করার চেষ্টা করছেন তা হ'ল মডিউল অবজেক্টের মধ্যে এমন একটি শ্রেণি অবজেক্টকে কল করা যা মডিউলটির সাথে একই নাম ধারণ করে।

এই ধরণের ত্রুটি যুক্তিযুক্তভাবে ভাঙ্গার এখানে একটি উপায়:

  • " module object is not callable। পাইথন আমাকে আমার কোডটি এমন কিছু বলার চেষ্টা করছে যা কল করা যায় না my আমার কোডটি কী কল করার চেষ্টা করছে?"
  • "কোডটি কল করার চেষ্টা করছে socketThat এটি কলযোগ্য হওয়া উচিত! ভেরিয়েবলটি socketকি আমার মনে হয় এটি?"
  • আমার সকেট কী তা প্রিন্ট করে চেক করা উচিত print socket

আমি বর্তমানে সকেটটি এর মতো ইমপোর্টটিং করছি: সকেট আমদানি থেকে
ইউজার 551717

আমি এটিকে সকেট আমদানি সকেট থেকেও পরিবর্তন করেছি এবং আমি এখনও একই ত্রুটি পাচ্ছি।
ব্যবহারকারী 551717

@ ব্যবহারকারী: আপনি যদি করেন তবে print socketদেখতে পাবেন যে নামটি socketএকটি মডিউল। এটি কোথাও যে মডিউল আবদ্ধ হতে হবে ! আপনার কোডটি সাবধানে পড়ুন এবং আমি নিশ্চিত যে আপনি import socketএমন একটি বা এমন কিছু দেখতে পাবেন যেখানে আপনি এটি আশা করেন না।
ক্যাট্রিয়েল

2
ওহ আমি পেয়েছি socket.socketএকটু বিভ্রান্ত ছিল। আমি কেবল import write_to_fileতখনই করেছি এবং তারপরে, যে পদ্ধতিটির ভিতরে আমি ব্যবহার করছিলাম তার write_to_file.pyনামকরণ করা হয়েছে writeToTextFileকেবল র্যান্ডwrite_to_file.writeToTextFile
মওদুলস

9
এটি লক্ষণীয় যে এটি কমপক্ষে 133 জন লোক যারা ভোট গ্রহণের জন্য সময় নিয়েছিল (আমার অন্তর্ভুক্ত) যারা এটি বুঝতে পারে না তাদের কাছে এটি স্পষ্ট ছিল না। এখন, এটি সুস্পষ্ট, এবং পরের বার আমি আমার সরঞ্জামবক্সে পৌঁছালে, কোনও মডিউল "কলযোগ্য নয়" হিসাবে রিপোর্ট করা হলে আমি এই সরঞ্জামটিটি পেয়ে যাব। একটি নতুন ভাষা দিয়ে শুরু করা সবচেয়ে কঠিনতম অংশ।
jmort253

168

ধরে নিন যে আপনার ক্লাস.পি এর সামগ্রীটি হ'ল:

class YourClass:
    # ......

আপনি যদি ব্যবহার করেন:

from YourClassParentDir import YourClass  # means YourClass.py

এইভাবে, আমি টাইপ-এরর পেয়েছি : আপনি যদি পরে চেষ্টা করার চেষ্টা করেন তবে 'মডিউল' অবজেক্ট কল করা যায় নাYourClass()

তবে, আপনি যদি ব্যবহার করেন:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

বা ব্যবহার করুন YourClass.YourClass(), এটি আমার পক্ষে কাজ করে।


2
বর্গ = আপনারক্লাস.আরক্লাস ()
কুনমিং Xie

2
আমি আপনার ক্লাস আমদানি *
কিথ

104

প্রধান যোগ করুন __init__.pyYourClassParentDir যেমন দেখুন:

from .YourClass import YourClass

তারপরে, আপনি যখন অন্য স্ক্রিপ্টে আমদানি করবেন তখন আপনার ক্লাসটি প্রস্তুত হওয়ার একটি উদাহরণ থাকবে:

from YourClassParentDir import YourClass

5
from .YourClass import YourClass এটি __init__.pyফাইলের মধ্যে থাকা উচিত নয় ?
নিকোলাস সিলার 10

28

এখানে আরেকটি গোছা, যা এই পোস্টগুলি পড়ার পরেও আমাকে দেখতে কিছুটা সময় নিয়েছিল। আমি আমার পাইথন বিন স্ক্রিপ্ট কল করতে একটি স্ক্রিপ্ট সেট আপ করছিলাম। আমি মডিউলটিও কলযোগ্য নয়।

আমার জিগটি ছিল আমি নিম্নলিখিতগুলি করছিলাম:

from mypackage.bin import myscript
...
myscript(...)

যখন আমার জ্যাগটি নিম্নলিখিতগুলি করার দরকার ছিল:

from mypackage.bin.myscript import myscript
...
myscript(...)

সংক্ষেপে, আপনার প্যাকেজ এবং মডিউল নেস্টিং ডাবল পরীক্ষা করুন।

আমি যা করার চেষ্টা করছি তার একটি স্ক্রিপ্ট ডিরেক্টরি রয়েছে যাতে * .পি এক্সটেনশন নেই এবং এখনও মাইপ্যাকেজ / বিনে থাকা 'বিন' মডিউল রয়েছে এবং এগুলিতে আমার * .পি এক্সটেনশন রয়েছে। আমি প্যাকেজিংয়ে নতুন এবং আমি তাদের মান ব্যাখ্যা করার সাথে সাথে মানগুলি অনুসরণ করার চেষ্টা করছি। সুতরাং, আমার সেটআপের মূলটি রয়েছে:

setup.py
scripts/
      script1
mypackage/
   bin/
      script1.py
   subpackage1/
   subpackage_etc/

এটি যদি মানদণ্ডের সাথে সামঞ্জস্য না করে থাকে তবে দয়া করে আমাকে জানান।


22

দেখে মনে হচ্ছে আপনি যা করেছেন তা socketমডিউল হিসাবে আমদানি করা হয়েছে import socket। সুতরাং socketমডিউল হয়। আপনাকে হয় সেই লাইনটি পরিবর্তন করতে হবে self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), সেই সাথে socketমডিউলটির প্রতিটি ব্যবহার , বা আমদানির বিবৃতিতে পরিবর্তন করতে হবে from socket import socket

অথবা আপনার import socketপরে একটি পেয়েছে from socket import *:

>>> from socket import *
>>> serv = socket(AF_INET,SOCK_STREAM)
>>> import socket
>>> serv = socket(AF_INET,SOCK_STREAM)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'module' object is not callable

আমি সকেটটি আমদানি করেছি: সকেট আমদানি থেকে * আমি এটি পরিবর্তন করতে পারি, তবে এতে কিছুটা সময় লাগবে, তাই আমি অনিচ্ছুক।
ব্যবহারকারী 551717

@ ব্যবহারকারী আপনি সম্ভবত পরে কোথাও একটি পেয়েছেন import socket, যা socketক্লাসকে ওভাররাইড করে মডিউলটি আমদানি করবে socket। সম্পাদনায় কোড স্নিপেট দেখুন।
মoinনুদ্দিন

3
@ ব্যবহারকারী: আপনার এটি পরিবর্তন করা উচিত। কারণ from <...> import *আমদানির হয় খারাপ, খারাপ, খারাপ বেশী বা এই কম: স্বাভাবিকভাবে আপনি কি জানেন ঠিক কি, গ্লোবাল নামস্থানে এটা ঠিক কি আপনি সেখানে রেখেছি কারণ। তবে আপনি যখন import *, অন্য মডিউলগুলির দ্বারা সংজ্ঞায়িত করা সমস্ত ধরণের স্টাফ দিয়ে সেই নেমস্পেসটি পূরণ করুন। এই ক্ষেত্রে, নামটি socketকোথা থেকে এসেছে তা অস্পষ্ট - এটি মডিউল বা সেই মডিউলে সংজ্ঞায়িত কিছু? আপনি যদি সর্বদা ব্যবহার করেন import socketবা from socket import socket, আপনার কখনই এই সমস্যা হবে না, যেহেতু আপনি ঠিক কী নাম ব্যবহার করছেন তা দেখতে পাবেন।
ক্যাট্রিয়েল

ঠিক আছে. ভকভগক. আমি অনেক টিউটোরিয়াল থেকে অভ্যাস পেয়েছি।
ব্যবহারকারী 551717

7

আমি জানি এই থ্রেডটি এক বছরের পুরনো, তবে আসল সমস্যাটি আপনার ওয়ার্কিং ডিরেক্টরিতে রয়েছে।

আমি বিশ্বাস করি যে ওয়ার্কিং ডিরেক্টরিটি C:\Users\Administrator\Documents\Mibot\oops\socket.pyএই ডিরেক্টরিতে নামক ফাইলটির জন্য দয়া করে পরীক্ষা করুন । একবার এটি খুঁজে পেলে, নাম পরিবর্তন করুন বা সরান। আপনি যখন সকেট আমদানি করেন, পাইথনের ডিরেক্টরি থেকে socket.pyপরিবর্তিত বর্তমান ডিরেক্টরি থেকে ব্যবহৃত হয় socket.py। আশা করি এটি সাহায্য করেছে। :)

দ্রষ্টব্য: আপনার প্রোগ্রামের ফাইলের নাম সংরক্ষণ করতে পাইথনের ডিরেক্টরি থেকে ফাইলের নাম কখনও ব্যবহার করবেন না; এটি আপনার প্রোগ্রাম (গুলি) এর সাথে বিরোধ করবে।


1
এটি অবশ্যই লক্ষণীয়। আমি কেবল সকেটগুলির সাথে একটি দ্রুত চেক করার চেষ্টা করছিলাম তাই আমি কেবল ফাইলটির নাম দিয়েছি socket.py। ঠিক আছে, যা এই একই একই ত্রুটি বার্তা কারণ ছিল। এই পৃষ্ঠাটি আমাকে ডান ট্র্যাকের উপরে ফেলেছে
স্লেস্ট

0

সেটআপ.পিতে কনসোল_স্রিপ্টস এন্ট্রিপয়েন্টটি কনফিগার করার সময় আমি খুঁজে পেলাম যখন এন্ডপয়েন্টটি মডিউলটির মধ্যে কোনও ফাংশনের পরিবর্তে মডিউল বা প্যাকেজ ছিল।

Traceback (most recent call last):
   File "/Users/ubuntu/.virtualenvs/virtualenv/bin/mycli", line 11, in <module>
load_entry_point('my-package', 'console_scripts', 'mycli')()
TypeError: 'module' object is not callable

উদাহরণ স্বরূপ

from setuptools import setup
setup (
# ...
    entry_points = {
        'console_scripts': [mycli=package.module.submodule]
    },
# ...
)

হওয়া উচিত ছিল

from setuptools import setup
setup (
# ...
    entry_points = {
        'console_scripts': [mycli=package.module.submodule:main]
    },
# ...
)

যাতে এটি মডিউলের পরিবর্তে কলযোগ্য ফাংশনটিকে বোঝায়। মডিউলে কোনও if __name__ == '__main__':ব্লক থাকলে কোনও পার্থক্য নেই বলে মনে হচ্ছে । এটি মডিউলটিকে কল করতে সক্ষম করবে না।


0

আমার ধারণা আপনি গ্লোবাল ভেরিয়েবল "মডিউল" সেট করে বিল্টিন ফাংশন / ভেরিয়েবল বা অন্য কিছু "মডিউল" ওভাররাইড করেছেন। এটিতে মডিউলটি কেবল প্রিন্ট করুন।


0

কোনও মডিউল কলযোগ্য নয় বলে আমদানির বিবরণী পরীক্ষা করুন। পাইথনে, সমস্ত কিছু (ফাংশন, পদ্ধতি, মডিউল, ক্লাস ইত্যাদি সহ) একটি বস্তু।


-1

এই সমস্যা সমাধানের একটি সহজ উপায় হ'ল রফতানিPYTHONPATH পরিবর্তনশীল পরিবেশ । উদাহরণস্বরূপ, ডেবিয়ান / জিএনইউ লিনাক্সে পাইথন ২.6 এর জন্য:

export PYTHONPATH=/usr/lib/python2.6`

অন্যান্য অপারেটিং সিস্টেমে আপনি প্রথমে এই মডিউল বা socket.pyফাইলটির অবস্থান খুঁজে পাবেন ।

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