TypeError: 'मॉड्यूल' ऑब्जेक्ट कॉल करने योग्य नहीं है


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
मुझे एक बार यह त्रुटि मिली क्योंकि मेरे पास (वैश्विक) चर और एक ही नाम के साथ एक फ़ंक्शन था।
रीमुस्टाटा

जवाबों:


563

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 पायथन मुझे अपना कोड बता रहा है जो कुछ कॉल करने की कोशिश कर रहा है जिसे कॉल नहीं किया जा सकता है। मेरा कोड कॉल करने की कोशिश कर रहा है?"
  • "कोड पर कॉल करने की कोशिश कर रहा है socket। यह कॉल करने योग्य होना चाहिए! चर है।"socket वह है जो मुझे लगता है कि यह है?"
  • मुझे पता लगाना चाहिए कि सॉकेट क्या है और जांचें print socket

मैं वर्तमान में इस तरह से सॉकेट लगा रहा हूं: सॉकेट आयात * से
user551717

मैंने इसे सॉकेट आयात सॉकेट से भी बदल दिया है और मुझे अभी भी वही त्रुटि मिल रही है।
user551717

@user: यदि आप करते हैं तो 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

मान लें कि YourClass.py की सामग्री है:

class YourClass:
    # ......

यदि तुम प्रयोग करते हो:

from YourClassParentDir import YourClass  # means YourClass.py

इस तरह, मुझे टाइप-इयरर मिला : 'मॉड्यूल' ऑब्जेक्ट कॉल करने योग्य नहीं है यदि आप तब उपयोग करने का प्रयास करते हैंYourClass()

लेकिन, यदि आप उपयोग करते हैं:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

या उपयोग YourClass.YourClass(), यह मेरे लिए काम करता है।


2
class = YourClass.YourClass ()
कुनमिंग Xie

2
मैंने इस मुद्दे को आपके क्लैस आयात *
कीथ

104

__init__.pyYourClassParentDir में मुख्य में जोड़ें, जैसे:

from .YourClass import YourClass

जब आप इसे किसी अन्य स्क्रिप्ट में आयात करते हैं, तो आपके पास अपनी कक्षा तैयार होने का एक उदाहरण होगा:

from YourClassParentDir import YourClass

5
यह फ़ाइल from .YourClass import YourClass में नहीं होना चाहिए __init__.py?
निकोलस सेइलर

28

यहाँ एक और गोचरा है, जिसने मुझे इन पदों को पढ़ने के बाद भी देखने में थोड़ी देर लगाई। मैं अपने अजगर बिन स्क्रिप्ट को कॉल करने के लिए एक स्क्रिप्ट सेट कर रहा था। मुझे मॉड्यूल भी कॉल करने योग्य नहीं मिल रहा था।

मेरी जिग था कि मैं निम्नलिखित कर रहा था:

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

जब मेरी ज़ग को निम्न कार्य करने की आवश्यकता होती है:

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

सारांश में, अपने पैकेज और मॉड्यूल नेस्टिंग की दोहरी जांच करें।

मैं जो करने की कोशिश कर रहा हूं, वह एक स्क्रिप्ट निर्देशिका है जिसमें * .py का विस्तार नहीं है, और अभी भी 'बिन' मॉड्यूल को mypackage / bin में होना है और इनका मेरा * .py विस्तार है। मैं पैकेजिंग के लिए नया हूं, और मानकों का पालन करने की कोशिश कर रहा हूं क्योंकि मैं उनकी व्याख्या कर रहा हूं। इसलिए, मेरे पास सेटअप रूट पर है:

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

मैंने सॉकेट आयात किया है: सॉकेट आयात से * मैं इसे बदल सकता हूं, लेकिन इसमें थोड़ा समय लगेगा, इसलिए मैं इससे अनिच्छुक हूं।
user551717

@user आप शायद बाद में कहीं मिल गए हैं import socket, जो socketवर्ग को ओवरराइड करने वाले मॉड्यूल को आयात करेगा socket। संपादन में कोड स्निपेट देखें।
मोइनुद्दीन

3
@user: आपको इसे बदलना चाहिए। from <...> import *आयात का कारण खराब है, बुरा है, खराब है , यह कमोबेश यही है: आमतौर पर आप जानते हैं कि वैश्विक नाम स्थान में वास्तव में क्या है, क्योंकि यह वही है जो आपने वहां रखा है। लेकिन जब आप import *, आप उस नाम स्थान को सभी प्रकार के सामान से भर देते हैं जिसे अन्य मॉड्यूल परिभाषित करते हैं। इस मामले में, यह स्पष्ट नहीं है कि नाम socketकहां से आया है - क्या यह मॉड्यूल या उस मॉड्यूल में परिभाषित कुछ है? यदि आप हमेशा उपयोग करते हैं import socketया from socket import socket, आपको कभी भी यह समस्या नहीं होगी, क्योंकि आप देख सकते हैं कि वास्तव में क्या नाम उपयोग में हैं।
काटरियल

ठीक है। पारितोषिक के लिए धन्यवाद। मैंने बहुत सारे ट्यूटोरियल से बस आदत डाल ली है।
user551717

7

मुझे पता है कि यह धागा एक साल पुराना है, लेकिन असली समस्या आपकी कामकाजी निर्देशिका में है।

मेरा मानना ​​है कि वर्किंग डायरेक्टरी है C:\Users\Administrator\Documents\Mibot\oops\। कृपया socket.pyइस निर्देशिका में नामित फ़ाइल की जाँच करें । एक बार जब आप इसे ढूंढ लेते हैं, तो इसका नाम बदलें या इसे स्थानांतरित करें। जब आप सॉकेट आयात करते हैं, तो पायथन की निर्देशिका से socket.pyवर्तमान निर्देशिका का उपयोग किया जाता है socket.py। उम्मीद है कि इससे मदद मिली। :)

नोट: अपने प्रोग्राम का फ़ाइल नाम सहेजने के लिए पायथन की निर्देशिका से फ़ाइल नामों का उपयोग कभी न करें; यह आपके कार्यक्रम के साथ संघर्ष करेगा।


1
यह निश्चित रूप से ध्यान देने योग्य है। मैं बस सॉकेट के साथ एक त्वरित जांच की कोशिश कर रहा था इसलिए मैंने बस फ़ाइल का नाम दिया socket.py। खैर, यह ठीक उसी त्रुटि संदेश के कारण था। इस पृष्ठ ने मुझे सही रास्ते पर ला खड़ा किया
Czechnology

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चर संवर्धन। उदाहरण के लिए, डेबियन / GNU लिनक्स में अजगर 2.6 के लिए:

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

अन्य ऑपरेटिंग सिस्टम में, आपको पहले इस मॉड्यूल या socket.pyफ़ाइल का स्थान मिलेगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.