我正在尝试使用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模块时,我都会收到导入错误。
以下是我的setup.py:
enter code here
from setuptools import setup, find_packages
from setuptools.extension import Extension
from Cython.Build import cythonize
import numpy
extensions = [
Extension(
"sonicparanoid.inpyranoid_c",
["sonicparanoid/inpyranoid_c.pyx"],
include_dirs=[numpy.get_include()],
),
Extension(
"sonicparanoid.mmseqs_parser_c",
["sonicparanoid/mmseqs_parser_c.pyx"],
include_dirs=[numpy.get_include()],
),
]
from codecs import open
from os import path
here = path.abspath(path.dirname(__file__))
# Get the long description from the README file
with open(path.join(here, 'README.rst'), encoding='utf-8') as f:
long_description = f.read()
setup(
name='sonicparanoid',
version='0.0.2', # Required
description='Whatever',
long_description=long_description, # Optional
url='http://iwasakilab.bs.s.u-tokyo.ac.jp/sonicparanoid/', # Optional
author='Me',
author_email='[email protected]',
classifiers=[ # Optional
'Development Status :: 5 - Production/Stable',
'Environment :: Console',
'Intended Audience :: Science/Research',
'Topic :: Scientific/Engineering :: Bio-Informatics',
'License :: OSI Approved :: GNU General Public License v3 (GPLv3)',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
],
packages = ['sonicparanoid',], # Required
install_requires=['numpy>=1.14.0', 'pandas>=0.22.0', 'cython>=0.27.0', 'sh>=1.12.14', 'setuptools>=24.2.0'], # specify minimum version
python_requires='>=3.5, <3.7',
ext_modules = cythonize(extensions, compiler_directives={'language_level': 3}),
package_dir={'sonicparanoid': 'sonicparanoid/'},
include_package_data=True,
package_data={'sonicparanoid': ['example/test_output/*', 'example/test_input/*', 'mmseqs2_src/*', 'quick_multi_paranoid/*']
},
entry_points={ # Optional
'console_scripts': [
'sonicparanoid = sonicparanoid.sonicparanoid:main',
],
},
)
导入语句的外观如下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'
我尝试使用此问题中提出的解决方案,但是如果例如更改导入from sonicparanoid import seq_tools as seqtools
并运行,python3 sonicparanoid.py
则会出现导入错误ImportError: cannot import name 'seq_tools'
任何帮助将不胜感激,这是我第一次尝试包装,这非常令人沮丧。
Python用于sys.path
查找模块/软件包,并将脚本目录添加到的开头sys.path
。考虑到这一点,让我研究导入的详细信息。
运行python sonicparanoid/sonicparanoid.py
Python时,会将目录添加sonicparanoid/
到sys.path
。现在,当目录在sys.path
脚本中时,可以seq_tools
直接导入,因为模块seq_tools.py
在中的目录中sys.path
。
当您安装软件包并运行生成的入口点时,sonicparanoid
该目录sonicparanoid/
不在sys.path
(但其父目录位于)中,并且Python无法导入seq_tools
。您必须将其导入为sonicparanoid.seq_tools
。但这意味着您不能从以脚本sonicparanoid.py
运行的方式导入它sonicparanoid.py
!
底线:不要sonicparanoid.py
作为脚本运行,因为sys.path
与运行入口点导入sonicparanoid
包太不同了。
另外,您的脚本名称不得与Python软件包相同。当您有一个包sonicparanoid
和一个脚本sonicparanoid.py
并且脚本尝试执行时import sonicparanoid
-Python尝试从脚本(因为它是第一个in sys.path
)而不是包中进行导入,但失败了。
你能说出你的脚本sonicparanoid
(不.py
扩展Python将不会尝试从它导入),或者sonic_paranoid.py
,但没有sonicparanoid.py
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句