0

由于一些导入问题,我在运行已安装的 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 模块。

任何帮助将不胜感激。

干杯。

4

1 回答 1

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/ 中的模块。这是因为您的脚本名称和包中实现的命名空间之间的冲突。

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

于 2013-12-12T22:22:51.260 回答