导入错误:伴随着错误信息“is not a package”。

48

在Python 3中遇到了导入错误的问题。 我的项目结构如下:

cts_sap_polaris/                                                                     
|-- etc                                                                              
|   |-- clean_cts_sap_polaris.yaml                                                   
|   |-- clean_env_variables.tcl                                                      
|   |-- cts_sap_polaris_ha_combined.yaml                                             
|   |-- cts_sap_polaris.yaml                                                         
|   `-- TCL_TESTBED_CONFIGS                                                          
|-- __init__.py                                                                      
|-- jobs
|   |-- __init__.py
|   |-- __pycache__
|   |   `-- run_cts_sap_polaris.cpython-34.pyc
|   `-- run_cts_sap_polaris.py
|-- lib
|   |-- cli_check.py
|   |-- cts_sap_polaris_utils.py
|   |-- __init__.py
|   |-- router_show_cts_cmd.py
|   |-- router_show_etherchannel_cmd.py
|   |-- router_show.py
|   |-- utils.py
|   |-- validate_show_output.py
|   `-- wait_for.py
|-- scripts
|   |-- cts_sap_polaris_ha_combined.py
|   |-- cts_sap_polaris.py
|   |-- __init__.py
|   `-- __pycache__
|       `-- cts_sap_polaris.cpython-34.pyc
`-- test
    |-- code_snippets
    |-- cts_interface.json
    |-- cts_interface_summary.json
    |-- etherchannel_port_channel.json
    |-- etherchannel_port.json
    |-- __init__.py
    |-- test_cts_sap_cli.py
    `-- test_router_show.py

我正在尝试在 scripts/cts_sap_polaris.py 中导入

import cts_sap_polaris.lib.cli_check as cli_check

哪个导致了这个错误:

ImportError: No module named 'cts_sap_polaris.lib'; 'cts_sap_polaris' is not a package.

3
你试图从哪个目录运行这个脚本?是在脚本目录内吗?你需要从获取树的目录或将其添加到PYTHONPATH中的相同目录中运行它。 - jedwards
11
实际上,你确实需要这么做,但在你的情况下,脚本目录中存在名为“cts_sap_polaris.py”的文件也会首先被找到。它也必须被重新命名(或移动)。 - jedwards
2
@jedwards:太棒了!我也遇到了同样的问题,一直在苦苦思索。按照你在第二条评论中建议的更改文件名的方法确实有所帮助。如果你不介意,我会将这个作为答案发布,因为我相信这也能解决原始问题。 - jersey bean
2个回答

79
将cts_sap_polaris.py重命名为其他名称。
此名称与包名称冲突(两者名称相同)。
(感谢@jedwards的评论)

在我的情况下,那是app/app.py。 - comalex3
在我的情况下,<my_package_name>/<my_package_name>.py。我希望Python能够检测到这种情况,并且从一开始就避免它。 - robmsmt
为什么重命名即使使用小写也有效? - Avv

1
我理解的是,Python只搜索当前目录和sys.path。因此,您可以在运行时添加到Python路径。类似的问题已经在这里得到了回答。
我建议您尝试一下...
# scripts/cts_sap_polaris.py
# Add additional path to current sys path
import sys
sys.path.insert(0,'/path/to/cts_sap_polaris/lib')
import cli_check

让我知道它是否有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接