2013-06-13 7 views
8

अद्यतन: इस पोस्ट के निचले हिस्से में कुछ और डिबगिंग जानकारी, जो अजगर राज्य में बहुत खराब दिखती है।फ़ंक्शन चलाते समय आयातित मॉड्यूल कोई नहीं बनते

मेरे पास एक मॉड्यूल है जो अन्य चीजों के साथ आयात करता है, django उपयोगकर्ता ऑब्जेक्ट।

आयात ठीक काम करता है, और कोड लोड होता है। हालांकि, जब आप उस ऑब्जेक्ट में फ़ंक्शन को कॉल करते हैं जो उपयोगकर्ता ऑब्जेक्ट का उपयोग करता है, तो यह त्रुटियों को कहता है कि उपयोगकर्ता कोई नहीं टाइप टाइप है।

कई अन्य आयात भी हैं, और कुछ मॉड्यूल स्तर वैश्विक चर जो फ़ंक्शन कहलाते समय भी कोई नहीं हैं।

विचित्र रूप से, यह हमारे स्टेजिंग वातावरण (उबंटू 12.04) में केवल एक समस्या है। यह स्थानीय रूप से ठीक काम करता है, जो शायद देव काम के लिए अतिरिक्त पायथन पैकेज के साथ स्टेजिंग जैसा दिखता है। उत्पादन में भी ठीक है।

क्या कोई इस से पहले आया है, और कोई विचार है कि इसका क्या कारण हो सकता है?

कोड यह रहा:

import urllib 
import time 
import urlparse 

# Django imports 
from django.db.models.signals import post_delete 
from django.db import models 
from django.contrib.auth.models import User 

from backends.cache.dualcache import cache 

# Piston imports 
from managers import TokenManager, ConsumerManager 
from signals import consumer_post_delete 

KEY_SIZE = 18 
SECRET_SIZE = 32 
VERIFIER_SIZE = 10 

CONSUMER_STATES = (
    ('pending', 'Pending'), 
    ('accepted', 'Accepted'), 
    ('canceled', 'Canceled'), 
    ('rejected', 'Rejected') 
) 


def generate_random(length=SECRET_SIZE): 
    return User.objects.make_random_password(length=length) 


class Consumer(models.Model): 
    name = models.CharField(max_length=255) 
    description = models.TextField() 

    key = models.CharField(max_length=KEY_SIZE) 
    secret = models.CharField(max_length=SECRET_SIZE) 

    status = models.CharField(max_length=16, choices=CONSUMER_STATES, default='pending') 

    objects = ConsumerManager() 

    def __unicode__(self): 
     return u"Consumer %s with key %s" % (self.name, self.key) 

    def generate_random_codes(self): 
     key = User.objects.make_random_password(length=KEY_SIZE) 
     secret = generate_random(SECRET_SIZE) 

     while Consumer.objects.filter(key__exact=key, secret__exact=secret).count(): 
      secret = generate_random(SECRET_SIZE) 

     self.key = key 
     self.secret = secret 
     self.save() 

और यहाँ काम के आसपास है, जो मूल रूप से आयात करने के लिए क्या आप समारोह के अंदर फिर से की जरूरत है अर्थ होता है:

import urllib 
import time 
import urlparse 

# Django imports 
from django.db.models.signals import post_delete 
from django.db import models 
from django.contrib.auth.models import User 

from backends.cache.dualcache import cache 

# Piston imports 
from managers import TokenManager, ConsumerManager 
from signals import consumer_post_delete 

KEY_SIZE = 18 
SECRET_SIZE = 32 
VERIFIER_SIZE = 10 

CONSUMER_STATES = (
    ('pending', 'Pending'), 
    ('accepted', 'Accepted'), 
    ('canceled', 'Canceled'), 
    ('rejected', 'Rejected') 
) 


def generate_random(length=SECRET_SIZE): 
    return User.objects.make_random_password(length=length) 


class Consumer(models.Model): 
    name = models.CharField(max_length=255) 
    description = models.TextField() 

    key = models.CharField(max_length=KEY_SIZE) 
    secret = models.CharField(max_length=SECRET_SIZE) 

    status = models.CharField(max_length=16, choices=CONSUMER_STATES, default='pending') 

    objects = ConsumerManager() 

    def __unicode__(self): 
     return u"Consumer %s with key %s" % (self.name, self.key) 

    def generate_random_codes(self): 
     from piston.models import KEY_SIZE, SECRET_SIZE, Consumer 
     from django.contrib.auth.models import User 
     from piston.models import generate_random 

     key = User.objects.make_random_password(length=KEY_SIZE) 
     secret = generate_random(SECRET_SIZE) 

     while Consumer.objects.filter(key__exact=key, secret__exact=secret).count(): 
      secret = generate_random(SECRET_SIZE) 

     self.key = key 
     self.secret = secret 
     self.save() 

यहाँ स्टैक ट्रेस है। त्रुटि लाइन के कारण होती है:

key = User.objects.make_random_password(length=KEY_SIZE) 

gener_random_codes फ़ंक्शन में।

Traceback: 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/contrib/admin/options.py" in wrapper 
    366.     return self.admin_site.admin_view(view)(*args, **kwargs) 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view 
    91.      response = view_func(request, *args, **kwargs) 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func 
    89.   response = view_func(request, *args, **kwargs) 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner 
    196.    return view(request, *args, **kwargs) 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper 
    25.    return bound_func(*args, **kwargs) 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view 
    91.      response = view_func(request, *args, **kwargs) 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func 
    21.     return func(self, *args2, **kwargs2) 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/db/transaction.py" in inner 
    224.     return func(*args, **kwargs) 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/contrib/admin/options.py" in add_view 
    970.    form = ModelForm(initial=initial) 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/forms/models.py" in __init__ 
    234.    self.instance = opts.model() 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/db/models/base.py" in __init__ 
    349.     val = field.get_default() 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/db/models/fields/related.py" in get_default 
    983.   field_default = super(ForeignKey, self).get_default() 
File "/sites/tellybug/shared/webserver/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in get_default 
    379.     return self.default() 
File "/sites/tellybug/releases/b92109dd526607b2af92ad6b7f494f3f06e31bb2/webserver/tellybug/tbapp/models/tellybugapp.py" in generate_new_consumer 
    11.  consumer.generate_random_codes() 
File "/sites/tellybug/releases/b92109dd526607b2af92ad6b7f494f3f06e31bb2/webserver/tellybug/piston/models.py" in generate_random_codes 
    57. key = User.objects.make_random_password(length=KEY_SIZE) 

Exception Type: AttributeError at /admin/tbapp/tellybugapp/add/ 
Exception Value: 'NoneType' object has no attribute 'objects' 

अद्यतन: यह कुछ सिर्फ उपयोगकर्ता ऑब्जेक्ट को हटाने नहीं है - कुछ समारोह में पूरे संदर्भ नष्ट कर रहा है।

def generate_random_codes(self): 
    """ 
    Used to generate random key/secret pairings. Use this after you've 
    added the other data in place of save(). 

    c = Consumer() 
    c.name = "My consumer" 
    c.description = "An app that makes ponies from the API." 
    c.user = some_user_object 
    c.generate_random_codes() 
    """ 
    import sys 
    print "Globals", globals() 
    print "Name ", __name__ 
    print "Package ", __package__ 
    print "Sys modules", sys.modules['piston.models'].__dict__ 
    key = User.objects.make_random_password(length=KEY_SIZE) 
इन प्रिंट बयान के साथ

, उत्पादन होता है:

Globals {'ColumnFamilyMap': None, 'datetime': None, 'KEY_SIZE': None, 'TokenManager': None, 'ConsistencyLevel': None, 'Nonce': None, 'uuid': None, 'cache': None, 'urllib': None, '__package__': None, 'models': None, 'User': None, .... } 
Name None 
Package None 
Sys modules {'ColumnFamilyMap': <class 'pycassa.columnfamilymap.ColumnFamilyMap'>, 'datetime': <type 'datetime.datetime'>, 'KEY_SIZE': 18, 'NonceType': <class 'piston.models.NonceType'>, 'OAuthToken': <class 'piston.models.OAuthToken'>, 'TokenManager': <class 'piston.managers.TokenManager'>, 'ConsistencyLevel': <class 'pycassa.cassandra.ttypes.ConsistencyLevel'>, 'Nonce': <class 'piston.models.Nonce'>, 'uuid': <module 'uuid' from '/usr/lib/python2.7/uuid.pyc'>, ...} 

ध्यान दें कि दोनों __package__ और __name__ अपरिभाषित कर रहे हैं, जो मैंने सोचा था कि काफी असंभव था, और है कि जब तक की sys.modules संस्करण मॉड्यूल में एक सही __dict__ है, globals() से वापसी मूल्य बकवास है।

+1

कृपया हमें वह कोड दिखाएं जो अपवाद फेंकता है, साथ ही पूर्ण ट्रेसबैक भी। –

+0

क्या आप सुनिश्चित हैं कि त्रुटि मॉडल से आ रही है, कहीं और नहीं? कृपया ट्रेसबैक भी दिखाएं। –

+0

धन्यवाद, जोड़ा गया स्टैक ट्रेस और लाइन जो त्रुटि फेंक रही है। –

उत्तर

7

यह एक आयातित मॉड्यूल में एक फ़ंक्शन के साथ होता है जो उस मॉड्यूल को कचरा इकट्ठा करने के बाद भी निष्पादित होता है।

चूंकि आपका कोड इस मुद्दे को पुन: उत्पन्न करने के लिए पर्याप्त नहीं है, इसलिए यहां एक सरल उदाहरण है जो व्यवहार दिखाता है। निम्नलिखित वाली फ़ाइल बनाएं और इसे पायथन कमांड लाइन या किसी अन्य फ़ाइल से आयात करें। यह काम नहीं करता है अगर आप इसे शीर्ष स्तर पर चलाते हैं।

import sys 
import threading 

x = "foo" 

def run(): 
    while True: 
     print "%s %s\n" % (sys, x) 

threading.Thread(target = run).start() 
sys.stdin.readline() 

यह चल रहा है:

$ python 
>>> import evil_threading 
<module 'sys' (built-in)> foo 

<module 'sys' (built-in)> foo 
... press Ctrl-C 
None None 

None None 
... press Ctrl-\ to kill the Python interpreter 

अजगर बंद के दौरान, मॉड्यूल None की तैयारी में हैं। This is an obscure Python behaviour that was removed in 3.4। इस उदाहरण में, मुख्य थ्रेड परिणामों को बंद करने में परिणाम समाप्त हो रहा है, लेकिन अन्य धागा अभी भी चल रहा है, इसलिए यह मॉड्यूल को None के रूप में देखता है।

from here का एक सरल उदाहरण है जो मॉड्यूल संदर्भ को sys.modules से सीधे हटाकर वही करता है।

import sys 
print sys 
del sys.modules['__main__'] 
print sys 
संबंधित मुद्दे