在自己创建的.egg-File中使用Python模块

时间:2014-01-05 10:18:39

标签: python setuptools distutils importerror

我是一名试图掌握Pythog的Java开发人员。我正在研究一个由三个组成部分组成的项目。服务器,客户端和公共部分。 (使用eclipse)

在公共包中,我创建了一个如下所示的模块:

'''
Created on 4 Jan 2014

@author: christian
'''
import logging

def logDebug(msg):
    logging.log(logging.DEBUG, msg)

def logInfo(msg):
    logging.log(logging.INFO, msg)

def logWarning(msg):
    logging.log(logging.WARNING, msg)

def logError(msg):
    logging.log(logging.ERROR, msg)

def logCritical(msg):
    logging.log(logging.CRITICAL, msg)

这很简单,只是一个测试。我为这个项目设置了一个setyp.py并创建了一个egg-File。 这个egg-Fille我在客户端项目中引用。看起来像这样:

import logging
from de.christianae.main.common import mylogging

def startUp():
    logging.basicConfig(filename="client.log", level=logging.DEBUG)

    mylogging.logCritical("Test Critical")


if __name__ == '__main__':
    startUp()

我想在这里做的是设置python loggin机制,而不是使用我自己的模块来避免总是达到日志级别。

当我尝试运行该代码时,我得到以下异常:

pydev debugger: starting
Traceback (most recent call last):
  File "/opt/eclipse/plugins/org.python.pydev_3.2.0.201312292215/pysrc/pydevd.py", line                      1706, in <module>
    debugger.run(setup['file'], None, None)
  File "/opt/eclipse/plugins/org.python.pydev_3.2.0.201312292215/pysrc/pydevd.py", line     1324, in run
    pydev_imports.execfile(file, globals, locals)  #execute the script
  File     "/home/christian/repository/synctoolclient/trunk/src/de/christianae/main/client/SyncToolClie    nt.py", line 7, in <module>
    from de.christianae.main.common import mylogging
ImportError: No module named common

我做错了什么?有没有更好的方法来完成像Java中的.jars那样的事情?

1 个答案:

答案 0 :(得分:1)

问题在于他的鸡蛋目录是这样的:

| de/
  | __init__.py
  | christianae/
    | __init__.py
    | main/
      | __init__.py
      | common/
        | __init__.py
        | code.py

当他使用设置工具制作鸡蛋时,它只包含来自__init__.py的{​​{1}},因此导入无效,因为Python没有看到c/作为一个模块,不会在树中更深入。

解决方法:展平为源de。因为他来自Java背景,所以他拥有所有这些目录是很自然的,但显然common/*.pysetuptools不喜欢这样。