在Python3.6中使用setuptools打包后出现ModuleNotFoundError

2024-07-02 10:40:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用setuptools从Python3.6应用程序生成一个包。当打包没有错误地终止时,setuptools生成的命令行程序无法导入包中的模块。 以下是我项目的目录树。在

.
├── MANIFEST.in
├── README.md
├── README.rst
├── contributors.txt
├── setup.cfg
├── setup.py
├── sonicparanoid
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── inpyranoid.cpython-36.pyc
│   │   ├── length_difference_filter.cpython-36.pyc
│   │   ├── ortholog_detection.cpython-36.pyc
│   │   ├── reads_stats.cpython-36.pyc
│   │   ├── seq_tools.cpython-36.pyc
│   │   ├── sonicparanoid.cpython-36.pyc
│   │   ├── sys_tools.cpython-36.pyc
│   │   └── workers.cpython-36.pyc
│   ├── bin
│   │   └── mmseqs
│   ├── blast_tools.py
│   ├── compile_inpyranoid_c.py
│   ├── compile_mmseqs_parser_c.py
│   ├── config.json
│   ├── example
│   │   ├── test_input
│   │   │   ├── chlamydia_trachomatis
│   │   │   ├── deinococcus_radiodurans
│   │   │   ├── gloeobacter_violaceus
│   │   │   └── thermotoga_maritima
│   │   └── test_output
│   │       └── README.txt
│   ├── inpyranoid.py
│   ├── inpyranoid_c.c
│   ├── inpyranoid_c.cpython-36m-darwin.so
│   ├── inpyranoid_c.pyx
│   ├── length_difference_filter.py
│   ├── mmseqs2_src
│   │   ├── README.txt
│   │   └── mmseqs.tar.gz
│   ├── mmseqs_parser_c.c
│   ├── mmseqs_parser_c.cpython-36m-darwin.so
│   ├── mmseqs_parser_c.pyx
│   ├── mmseqs_parser_cython.py
│   ├── ortholog_detection.py
│   ├── quick_multi_paranoid
│   │   ├── Makefile
│   │   ├── Makefile.in
│   │   ├── config
│   │   ├── dump.cpp
│   │   ├── gen_header.cpp
│   │   ├── hashtable.c
│   │   ├── hashtable.h
│   │   ├── hashtable.o
│   │   ├── hashtable_itr.c
│   │   ├── hashtable_itr.h
│   │   ├── hashtable_private.h
│   │   ├── ortholog.c
│   │   ├── qa.h
│   │   ├── qa1
│   │   ├── qa1.cpp
│   │   ├── qa2
│   │   ├── qa2.cpp
│   │   ├── qp
│   │   ├── qp.c
│   │   └── qps.c
│   ├── reads_stats.py
│   ├── seq_tools.py
│   ├── setup_sonicparanoid.py
│   ├── sonicparanoid.py
│   ├── sys_tools.py
│   ├── test_blast_tools.py
│   ├── test_length_difference_filter.py
│   ├── test_ortholog_detection.py
│   ├── test_reads_stats.py
│   ├── test_seq_tools.py
│   ├── test_sonicparanoid.py
│   ├── test_sys_tools.py
│   └── workers.py
└── user_manual.pdf

如果我运行python3 sonicparanoid.py,它可以正常工作,但是如果我使用setuptools创建发行版,那么每当主程序运行时,我都会收到一个导入错误(sonicparanoid.py)尝试导入包(sonicparanoid)目录中的任何其他.py模块。在

以下是我的设置.py公司名称:

^{pr2}$

导入语句在sonicparanoid.py中的外观如下:

import os
import sys
import platform
import seq_tools as seqtools

目前,如果我执行python3 sonicparanoid.py,一切正常,但是当我使用使用setuptools生成的程序时,我得到以下错误:

Traceback (most recent call last):
  File "/usr/local/bin/sonicparanoid", line 11, in <module>
    load_entry_point('sonicparanoid==0.0.2', 'console_scripts',     'sonicparanoid')()
  File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 572, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2755, in load_entry_point
    return ep.load()
  File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2408, in load
    return self.resolve()
  File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py",     line 2414, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/usr/local/lib/python3.6/site-packages/sonicparanoid-0.0.2-py3.6-    macosx-10.13-x86_64.egg/sonicparanoid/sonicparanoid.py", line 5, in <module>
    import seq_tools as seqtools
ModuleNotFoundError: No module named 'seq_tools'

我试过使用这个question中提出的解决方案, 但是,如果我用from sonicparanoid import seq_tools as seqtools更改导入并运行python3 sonicparanoid.py,我会得到一个导入错误ImportError: cannot import name 'seq_tools'

任何帮助将不胜感激,这是我第一次尝试包装,这是相当令人沮丧。在


Tags: inpytestimportinitusrcpythontools
1条回答
网友
1楼 · 发布于 2024-07-02 10:40:58

Python使用sys.path查找模块/包,并将脚本的目录前置到sys.path的开头。考虑到这一点,让我看看进口的细节。在

运行python sonicparanoid/sonicparanoid.py时,Python会将目录sonicparanoid/添加到sys.path。现在当目录在sys.path中时,脚本可以直接导入seq_tools,因为模块seq_tools.py位于{}的目录中。在

当您安装包并运行生成的入口点sonicparanoid时,目录sonicparanoid/不在sys.path(但其父目录在)中,Python无法导入seq_tools。您必须将其作为sonicparanoid.seq_tools导入。但这意味着当您以脚本形式运行sonicparanoid.py时,不能从sonicparanoid.py导入它!在

{{t{10>从一个点导入的包{t>也不一样。在

另外,脚本的名称不能与Python包的名称相同。当您有一个包sonicparanoid和一个脚本sonicparanoid.py并且脚本尝试import sonicparanoid-Python尝试从脚本导入(因为它是sys.path中的第一个),而不是从包中导入,但失败了。在

您可以将脚本命名为sonicparanoid(没有.py扩展,Python不会尝试从中导入)或sonic_paranoid.py,但不能sonicparanoid.py。在

相关问题 更多 >