这个问题看似微不足道,但我无法在网上找到单个答案。这是我的设置:
VsDevCmd.bat arch=amd64 && cmake <options> ...
现在,我要跑步
project:
- src:
- - __init__.py (empty)
- - file1.py
- - file2.py
- test:
- - test1.py
- - test2.py
- - __init__.py (empty)
从项目文件夹中。
在test1.py中,我从第一个源文件导入和导入:
python -m unittest discover
但是在file1.py中,我是从另一个导入的:
from src.file1 import class1
如上所述运行单元测试会导致:
from file2 import class2
我在这里做什么错了?
谢谢您,祝您愉快!
答案 0 :(得分:0)
您应完全限定进口产品的质量,而不是:
from file2 import class2
使用
from .file2 import class2
在.
之后注意from
。
更新:验证:
(dev) go|c:\srv\tmp\unttst\project> tree
.
|-- src
| |-- __init__.py
| |-- file1.py
| `-- file2.py
`-- test
|-- __init__.py
`-- test1.py
2 directories, 5 files
(dev) go|c:\srv\tmp\unttst\project> type src\file1.py
from .file2 import Class2
class class1:
pass
(dev) go|c:\srv\tmp\unttst\project> type src\file2.py
class Class2:
pass
(dev) go|c:\srv\tmp\unttst\project> type test\test1.py
from src.file1 import class1
(dev) go|c:\srv\tmp\unttst\project> python -m unittest discover
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
(dev) go|c:\srv\tmp\unttst\project>
请注意,我正在从from src.xxx
有意义的目录中运行命令。
更新2:注意,Python不能满足直接在子目录中(即作为入口点)运行单个文件的需要。 Guido强烈反对这种用法,因此这种情况不太可能改变。尽管您可以解决此问题,但正确的做法非常简单,值得学习。
我们首先将src/file1.py
更改为具有main()
功能:
(dev) go|c:\srv\tmp\unttst\project> cat src\file1.py
from .file2 import Class2
class class1:
pass
def main():
print("hello from main")
注意:我没有添加if __name__=="__main__"
部分。
从命令行调用此函数的正确方法是使project
成为“真实”包。
通过添加setup.py
文件来创建“真实”包。 setup.py
文件可以包含很多字段,但是此用例唯一需要的字段如下:
(dev) go|c:\srv\tmp\unttst\project> cat setup.py
from setuptools import setup
setup(
name="myproject",
entry_points={
'console_scripts': """
run-file1 = src.file1:main
"""
}
)
请注意,setup.py
位于project
文件夹中。
接下来,您以“开发”模式安装软件包:
(dev) go|c:\srv\tmp\unttst\project> pip install -e .
最后请注意.
。
setup.py
文件中的entry_points .. console_scripts现在为您创建了一个新的shell命令:
(dev) go|c:\srv\tmp\unttst\project> run-file1
hello from main
console_scripts行
run-file1 = src.file1:main
表示要创建一个名为run-file
的shell命令,该命令应执行main
中的src.file1
函数。