【问题标题】:Using Python Modules in from self created .egg-File在自己创建的 .egg 文件中使用 Python 模块
【发布时间】:2014-01-05 10:18:38
【问题描述】:

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

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

'''
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 登录机制,而不是使用我自己的模块来避免总是不得不进入日志级别。

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

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

我做错了什么?有没有更好的方法来完成类似 .jar 在 Java 中所做的事情?

【问题讨论】:

  • 您是否缺少__init__.py 文件? commonmylogging 是实际的目录和文件名吗?
  • 我在“/de/christianae/main/common/”中有四个文件。 “init.py”、“init.pyc”、“mylogging.py”和“mylogging.pyc”。 'common' 是目录,'mylogging.py' 是文件名。
  • 我怀疑你import mylogging时引用的不是egg文件,而是目录结构。尝试将 test 和 egg 移动到一个完全不同的目录树,看看错误是否改变。要从鸡蛋导入,您必须将其添加到您的路径:like this.
  • 你熟悉eclipse吗?我将鸡蛋添加到那里的 Pythonpath 中。有没有文件可以检查路径是否正确?编辑:如果我在不更改任何内容的情况下移动它,我会从 eclipse 中得到一个“未解决的导入:mylogging”。当我更改 PATH 时,我得到了同样的异常。
  • 我尝试使用:import sys sys.path.insert(0, '/home/christian/repository/synctoolclient/trunk/lib/de/christianae/main/common/') 同样的异常跨度>

标签: python setuptools distutils importerror


【解决方案1】:

问题是他的 egg 目录是这样的:

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

当他使用设置工具从中制作鸡蛋时,它只包含来自 c/__init__.py,因此导入不起作用,因为 Python 没有将 de 视为模块,并且不会不要深入树中。

解决方法:扁平化到common/*.py 的源。因为他来自 Java 背景,所以拥有所有这些目录对他来说是很自然的,但显然 setuptoolsdistutils 不喜欢那样。

【讨论】: