由于一些导入问题,我在运行已安装的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模块。
非常感谢任何帮助。
干杯。
答案 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 /中的模块。这是因为脚本名称与程序包中实现的命名空间之间存在冲突。
您的包的命名空间需要更改,或者命令行脚本名称需要更改。