运行已安装脚本时的Python ImportError

时间:2013-06-03 22:09:35

标签: python import installation package

由于一些导入问题,我在运行已安装的python脚本时遇到了一些麻烦。

我的包结构如下:

MANIFEST.in
setup.py
bin/opal.py
bin/opal/
   /__init__.py
   /__init__.pyc
   /core.py
   /core.pyc        
   /io.py
   /file.py
   /import_limesurvey.py
   /dictionary.py
   /io.pyc
   /importer.pyc
   /data.py
   /rest.py

rest.py中有一个类:

class OpalRestCommand:
  ...

opal.py文件以下列方式使用此模块:

import opal.rest
...
restCmd = opal.rest.OpalRestCommand()

这是设置定义:

...
setup_args = get_kw(
    name=PACKAGE_NAME,
    version=VERSION,
    author=AUTHOR,
    author_email=AUTHOR_EMAIL,
    maintainer=MAINTAINER,
    maintainer_email=MAINTAINER_EMAIL,
    url=URL,
    license=LICENSE,
    description=DESCRIPTION,
    long_description=DESCRIPTION_LOG,
    platforms=PLATFORMS,
    packages = ['opal', 'opal.protobuf']
    package_dir = {'opal': 'bin/opal'}
    scripts=['bin/opal.py']
)

...

if __name__ == '__main__'
   # do some manipulation with argv
   apply(setup, (), setup_args)

当我在客户端计算机(MAC)上安装它并运行opal.py命令时,我总是收到错误:

 ImportError: No module name rest

但是,如果我创建一个使用rest模块的测试程序,我没有导入问题。我是Python的新手,我不知道我是否应该为已安装的脚本做一些特别的事情!我假设opal.py脚本应该以与测试程序相同的方式找到我的rest模块。

非常感谢任何帮助。

干杯。

1 个答案:

答案 0 :(得分:0)

在我意识到自己没有正确尊重python导入路径之前,我花了一些时间来解决这个问题。

当您运行的脚本的名称与命名空间的根目录匹配时,将存在名称空间问题。 opal.py与opal / init .py相冲突。当您使用setuptools时甚至会发生这种情况。

假设SITEPACKAGES = / usr / lib / pythonX.Y / site-packages,您的软件包将安装在$ SITEPACKAGES / opal- $ version.egg,您的脚本将安装在$ SITEPACKAGES / opal- $ version.egg / EGG-INFO / bin / opal.py,文件已添加到/ usr / local / bin,用于加载放置在EGG-INFO / bin /中的脚本。当该脚本加载时,存在一个小问题。

python路径将包含$ SITEPACKAGES / opal- $ version.egg / EGG-INFO / bin /。当导入器尝试导入opal中的任何内容时,它将导入您正在运行的脚本,而不是$ SITEPACKAGES / opal- $ version.egg / opal /中的模块。这是因为脚本名称与程序包中实现的命名空间之间存在冲突。

您的包的命名空间需要更改,或者命令行脚本名称需要更改。