在python项目上工作时,我试图将源代码和单元测试分开;这是项目结构:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/football_pitch">
<TextView
android:id="@+id/playerNameTop"
android:layout_width="350dp"
android:layout_height="358dp"
android:layout_marginStart="16dp"
android:drawableTop="@drawable/ic_football_top"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
</RelativeLayout>
这是MyProject/
MANIFEST.in
README.md
setup.py
source/
__init.py__
my_project/
__init.py__
some_module.py
test/
__init.py__
my_project/
__init.py__
test_some_module.py
文件:
setup.py
然后,当我运行命令from setuptools import setup, find_packages
setup(
name='my_project',
packages=find_packages(where='./source'),
description='My project to be packaged',
version='1.0.0',
author='me'
install_requires=[
'fastnumbers~=2.0.1',
'numpy~=1.14.1',
'pandas~=0.22.0'
],
extras_require={
'dev': ['check-manifest'],
'test': [
'mock',
'PyHamcrest',
'pytest',
'pytest-cov'
],
}
)
时,它将失败,并显示以下输出:
python3 setup.py sdist
生成的running sdist
running egg_info
writing my_project.egg-info/PKG-INFO
writing requirements to my_project.egg-info/requires.txt
writing dependency_links to my_project.egg-info/dependency_links.txt
writing top-level names to my_project.egg-info/top_level.txt
error: package directory 'my_project' does not exist
文件看起来不错:
top_level.txt
但是看起来 my_project
不是从setuptools
文件夹开始,无法找到要打包的模块。
source
和setup.py
文件移动到MANIFEST.in
文件夹中?source
函数中的这个where
自变量是什么?答案 0 :(得分:7)
您距离可行的解决方案仅一步之遥。添加
package_dir={
'': 'source',
},
转到setup()
参数:
setup(
...,
packages=find_packages(where='source'),
package_dir={
'': 'source',
},
...
)
有关软件包重新映射的更多信息,请参见Listing whole packages部分。
但是,好像您通过在其中放置source
来将__init__.py
目录创建为python软件包。那是故意的吗?您是否有类似
import source.my_project
from source.my_project.my_module import stuff
或类似的名称,使用source
作为包名称?然后要注意,一旦安装了构建的软件包,导入将失败,因为在构建中包括源时会省略source
。我看到两种方式:
source/__init__.py
,使用如上所述的package_dir
将my_project
制作为顶级软件包,在导入中省略source
(如果出现任何错误,只需删除myproject-1.0.0.egg_info
目录,并使用python setup.py egg_info
重新创建),或source
作为顶层程序包:不要使用package_dir
,请在项目根目录(packages=find_packages()
中未明确说明where
的情况下查找程序包。) li>