回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我遇到模块导入问题。在</p>
<p>在ubuntu 10.10上使用Python2.6</p>
<p>我有一个类,它在<a href="http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/" rel="nofollow">http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/</a>处子类化守护进程。我创建了一个python包,其中包含从django项目导入一些模型的代码。当从类中使用时,代码可以工作,而不是守护程序的子类化。结构看起来像:</p>
<pre><code>my_module
__init__.py
- bin
- cfg
- core
__init__.py
collection.py
daemon.py
</code></pre>
<p>ItemRepository代码:</p>
^{pr2}$
<p>守护程序代码(在/usr/local/bin中/testdaemon.py)公司名称:</p>
<pre><code>import sys
from my_module.core.daemon import Daemon
from my_module.core.collection import ItemRepository
import logging
import time
class TestDaemon(Daemon):
default_conf = '/etc/echodaemon.conf'
section = 'echo'
def run(self):
while True:
logging.info('The echo daemon says hello')
ir = ItemRepository(project_path=self.project_path)
items = ir.get_scheduled_collectors() #TRIGGERS ERROR
logging.info('there are %d scheduled items' % len(items))
time.sleep(1)
if __name__ == '__main__':
TestDaemon().main()
</code></pre>
<p>我得到的错误是“NameError:global name'my'u module'is not defined”它已经超过了导入,但在尝试调用对象上的方法时失败。我想这和系统路径/PYTHONPATH,但我知道我的django项目正在进行中,因为我已经把它打印出来了。到目前为止,python文档或学习python都没有任何帮助。是否有人对模块导入有任何见解或了解很好的参考资料?在</p>
<p>更新:</p>
<p>现在我试图简化这个问题,使它更容易理解。现在我有一个目录结构,它看起来像:</p>
<pre><code>/home
/username
/django
/someproj
/web
models.py
/my_module
daemon.py
</code></pre>
<p>我在/etc中设置了$PYTHONPATH变量/巴什.bashrc到“/home/username/django”。在</p>
<p>在testdaemon.py文件导入如下所示:</p>
<pre><code>import logging
from django.core.management import setup_environ
from someproj import settings
setup_environ(settings)
from someproj.web.models import ItemConfiguration
</code></pre>
<p>但现在我有一个重要的问题:没有名为“someproj”的模块。所以我把路径加了上去。在</p>
<pre><code>import sys
sys.path.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>('/home/username/django')
import logging
from django.core.management import setup_environ
from someproj import settings
setup_environ(settings)
from someproj.web.models import ItemConfiguration
</code></pre>
<p>现在重要的是:没有名为“web”的模块。回溯如下:</p>
<pre><code>Traceback (most recent call last):
File "testdaemon.py", line 77, in <module>
TestDaemon('/tmp/testdaemon.pid').run()
File "testdaemon.py", line 47, in run
scheduled_items = [item for item in ItemConfiguration.objects.filter(disabled=False) if collector.scheduled]
File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 141, in filter
return self.get_query_set().filter(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 550, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 568, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1128, in add_q
can_reuse=used_aliases)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1026, in add_filter
negate=negate, process_extras=process_extras)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1179, in setup_joins
field, model, direct, m2m = opts.get_field_by_name(name)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/options.py", line 291, in get_field_by_name
cache = self.init_name_map()
File "/usr/local/lib/python2.6/dist-packages/django/db/models/options.py", line 321, in init_name_map
for f, model in self.get_all_related_m2m_objects_with_model():
File "/usr/local/lib/python2.6/dist-packages/django/db/models/options.py", line 396, in get_all_related_m2m_objects_with_model
cache = self._fill_related_many_to_many_cache()
File "/usr/local/lib/python2.6/dist-packages/django/db/models/options.py", line 410, in _fill_related_many_to_many_cache
for klass in get_models():
File "/usr/local/lib/python2.6/dist-packages/django/db/models/loading.py", line 167, in get_models
self._populate()
File "/usr/local/lib/python2.6/dist-packages/django/db/models/loading.py", line 61, in _populate
self.load_app(app_name, True)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/loading.py", line 76, in load_app
app_module = import_module(app_name)
File "/usr/local/lib/python2.6/dist-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
ImportError: No module named web
</code></pre>
<p>所以根据之前的评论,我试着补充:</p>
<pre><code>import sys
sys.path.append('/home/username/django')
import logging
from django.core.management import setup_environ
from someproj import settings
setup_environ(settings)
from someproj import web
from someproj.web import models
from someproj.web.models import ItemConfiguration
</code></pre>
<p>但这没用。所以我创建了一个非常简单的文件:</p>
<pre><code>#!/usr/bin/python
import logging
import time
import sys
sys.path.append('/home/username/django')
from django.core.management import setup_environ
from someproj import settings
setup_environ(settings)
from someproj.web.models import ItemConfiguration
if __name__ == '__main__':
print sys.path
items = ItemConfiguration.objects.all()
for item in items:
print item
</code></pre>
<p>这很管用!这只会让我更加困惑。所以现在我在想也许这和守护进程有关。它使用os.fork操作系统()我不确定路径是否仍在设置中。这就是为什么我在/etc中设置$PYTHONPATH变量/巴什.bashrc文件。在</p>
<p>还有什么见解吗?我真的需要守护进程,我没有太多选择,因为我需要一个长时间运行的进程。在</p>