Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行python setup.py测试时导入错误_Python_Bash_Unit Testing_Import - Fatal编程技术网

执行python setup.py测试时导入错误

执行python setup.py测试时导入错误,python,bash,unit-testing,import,Python,Bash,Unit Testing,Import,我正在制作一个简单的python应用程序。我不知道我做的是否正确,所以请在评论中纠正我,或者你对此是否有答案 错误: ImportError: No module named 'taskhandler' 以及: 文件结构: . ├── MANIFEST.in ├── pydotask.egg-info │   ├── dependency_links.txt │   ├── not-zip-safe │   ├── PKG-INFO │   ├── SOURCES.txt │   └── to

我正在制作一个简单的python应用程序。我不知道我做的是否正确,所以请在评论中纠正我,或者你对此是否有答案

错误:

ImportError: No module named 'taskhandler'
以及:

文件结构:

.
├── MANIFEST.in
├── pydotask.egg-info
│   ├── dependency_links.txt
│   ├── not-zip-safe
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   └── top_level.txt
├── README.md
├── setup.py
├── task_mod
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-35.pyc
│   │   ├── pydo.cpython-35.pyc
│   │   └── taskhandler.cpython-35.pyc
│   ├── pydo.py
│   ├── styles
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-35.pyc
│   │   │   ├── termcolor.cpython-35.pyc
│   │   │   └── text_style.cpython-35.pyc
│   │   ├── termcolor.py
│   │   └── text_style.py
│   ├── taskhandler.py
│   └── tasks.csv
└── update.txt

5 directories, 22 files
'task_mod/pydo.py':

#/usr/bin/env蟒蛇3
“Python中的待办事项应用程序”
导入系统,操作系统
将taskhandler作为任务导入
从样式导入文本\u样式作为文本
从样式导入术语颜色
task\u mod/taskhandler.py

#/usr/bin/env蟒蛇3
导入系统,操作系统
导入csv
从样式导入术语颜色
从样式导入文本\u样式作为文本
setup.py

从设置工具导入设置
def readme():
以open('README.md')作为自述文件:
返回readme.read()
设置(
name='pydotask',
版本='0.2',
description='PyDo是一个CLI应用程序,它可以让您跟踪任务和项目',
long_description=readme(),
分类器=[
“发展状况:3-阿尔法”,
'编程语言::Python::3.5',
'主题::办公室/业务::日程安排'
],
关键词='utilities office日程任务提醒',
url=“”,
作者='Abhishta Gatya',
作者(电邮地址)abhishtagatya@yahoo.com',
包=['task_mod'],
脚本=['task_mod/pydo'],
python_需要='>=3',
include_package_data=True,
zip_safe=False
)
我该如何避开这个问题


注意:如果我运行
python3任务_mod/pydo.py
它工作正常!但是当我试着测试它时,它给出了2个导入器。

您必须指定setup.py中使用的所有模块,而不仅仅是顶级文件夹。因此,在setup.py文件中,将行
packages=['task\u mod'],
替换为
packages=['task\u mod','task\u mod.styles','task\u mod.taskhandler'],

或者,在不更改
设置.py
的情况下,您可以使用
导入任务_mod.样式
或从任务_mod导入样式导入
。然后您可以使用
style.termcolor
等样式的文件

或者,您可以使用setuptool的黑魔法功能
find_packages
如下:
packages=find_packages(),


首先,请注意,您在
setup.py
中提供了一个名为
task\u mod
的包。这意味着,您只能
导入任务_mod
导入任务_mod.blah
,而不能
导入blah
。因为您的库中没有提供
blah
。尝试将导入更改为绝对导入

第二,如果您仍然需要相对导入(这是使用单个库的常见做法-这样更容易维护代码),则应该相对导入:
from.styles导入术语color
(注意点)

第三,相对导入只影响模块和包,而不影响直接执行的脚本(因为
pydo.py
是包
\uuuuuuuu main\uuuuuuu
,而不是
task\u mod.pydo
,它改变了一切)。对于脚本,有两种选择可以正确执行:

选择A(一般):始终导入绝对包/模块名称(
import task\u mod.taskhandler as tashhandler
,在pydo.py中;也从task\u mod.styles导入术语color
,等等)

选项B(最佳实践):切勿将任何脚本作为库的一部分导出(仅用于构建/测试/CI/CD目的)。而是导出控制台脚本的入口点(google:setuptools入口点)


设置(
....
入境点={
“控制台脚本”:[
'pydo=task_mod.pydo:main',
],
},
)

当然,还要在该模块中定义
main()
函数

shebangs(
#!…蟒蛇3
)在这里完全不相关


UPD:

如果您在导入时遇到问题,请记住:

您应该以某种方式使包位于PYTHONPATH env var(或
sys.path
内部变量)上。这正是Python在执行
导入操作时查找内容的地方

您可以在任何导入之前
打印(sys.path)
以了解为什么会发生这种情况-第一个元素将是脚本的dir,它将在
task\u mod/pydo.py
setup.py
调用之间变化

在主项目目录(
python3 setup.py
)中运行脚本时,
sys.path
以项目目录开始<代码>任务_mod
在那里,您可以导入它。另外,当您执行类似于
pip安装-e.
的操作时,这些包也将“安装”到Python/virtualenv库列表中,但安装方式不同

但是,当您运行
python3任务\u mod/pydo.py
时,您当前的目录是
../task\u mod/
。在那里,您无法找到
task\u mod
package(因为它是一个更高的级别)

另一方面,当您运行
python3 setup.py
时,您当前的目录是项目的目录,并且您不能像最初那样直接导入
样式
任务处理程序
(无需通过
任务模块
作为前缀)

这正是为什么您永远不应该依赖于
sys.path
,也不应该直接使用脚本并假定其位置的原因。因为它是变化的


您可以尝试运行
PYTHONPATH=。python3 task_mod/pydo.py
使其与
setup.py
的工作方式相同(或
PYTHONPATH=./task_mod/python3 setup.py
使其与
task_mod/pydo.py
的工作方式相同)。但这是一个肮脏的黑客使其工作。相反,您应该根据Python的约定正确地布局库。

这不是因为行
#/usr/bin/env python3
pydo.py
taskhandler.py的开头<
.
├── MANIFEST.in
├── pydotask.egg-info
│   ├── dependency_links.txt
│   ├── not-zip-safe
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   └── top_level.txt
├── README.md
├── setup.py
├── task_mod
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-35.pyc
│   │   ├── pydo.cpython-35.pyc
│   │   └── taskhandler.cpython-35.pyc
│   ├── pydo.py
│   ├── styles
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-35.pyc
│   │   │   ├── termcolor.cpython-35.pyc
│   │   │   └── text_style.cpython-35.pyc
│   │   ├── termcolor.py
│   │   └── text_style.py
│   ├── taskhandler.py
│   └── tasks.csv
└── update.txt

5 directories, 22 files