Python目录地狱
以下是我的目录结构:Python目录地狱,python,Python,以下是我的目录结构: ├── src │ ├── helpers │ │ ├── __init__.py │ │ ├── foo.py │ │ └── bar.py │ ├── services │ │ ├── __init__.py │ │ ├── faz.py │ │ └── baz.py │ └── main.py ├── tests │ ├── helpers │ │ ├── test_foo.py │ │
├── src
│ ├── helpers
│ │ ├── __init__.py
│ │ ├── foo.py
│ │ └── bar.py
│ ├── services
│ │ ├── __init__.py
│ │ ├── faz.py
│ │ └── baz.py
│ └── main.py
├── tests
│ ├── helpers
│ │ ├── test_foo.py
│ │ └── test_bar.py
│ ├── services
│ │ ├── test_faz.py
│ │ └── test_baz.py
我的src/helpers/_init__.py
如下所示:
from.foo导入foo
from.bar导入栏
而src/services/_init__.py
如下所示:
from.faz导入faz
from.baz导入baz
Mysrc/main.py
:
导入帮助程序
f=helpers.Foo()
我的测试/助手/test\u foo.py
:
将src.helpers导入为帮助程序
def test_foo():
f=helpers.Foo()
所有这些都有效
但是,我的问题是,比如说,src\services\faz.py
referencessrc\helpers\foo.py
当前,..\faz.py
看起来如下所示:
导入帮助程序
类Faz():
def剂量测定(自身):
#某物
如果我运行pythonsrc/main.py
,这就可以了。但是如果我运行coverage run-m pytest
,我会得到错误ModuleNotFoundError:没有名为“helpers”的模块
。如果我将import语句更改为import src.helpers
,则测试可以工作,但应用程序不再工作
我该如何解决这个问题
谢谢 找到了答案……对于那些偶然发现这一点的人: 由于
helpers
和services
被视为两个不同的模块,因此python不允许在模块级别上引用。运行python./src/main.py
可以工作,因为模块是main.py
,但是,pytest
测试只看到helpers
模块和services
模块
关键是将以下代码添加到services
文件夹中的\uuuu init\uuuuuuuuuuuuy.py
(在我的例子中,服务引用帮助程序),以便父文件夹包含在搜索路径中
#src/services/_uuinit_uuuu.py
导入操作系统,系统
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(_文件__)))
现在
services
文件夹中的所有脚本/模块都可以从helpers
文件夹导入模块。我认为您需要将其转换为可安装的python包。您只需执行普通的python包导入,而不必修改路径。假设此产品名为“foopackage”,则可以添加src/foopackage并包含setup.py文件
├── src
│ ├── foopackage
│ │ ├── helpers
│ │ │ ├── __init__.py
│ │ │ ├── foo.py
│ │ │ └── bar.py
│ │ └── services
│ │ ├── __init__.py
│ │ ├── faz.py
│ │ └── baz.py
│ └── scripts
│ └── main.py
├── tests
│ ├── helpers
│ │ ├── test_foo.py
│ │ └── test_bar.py
│ ├── services
│ │ ├── test_faz.py
│ │ └── test_baz.py
├── setup.py
您可以使用python setup.py bdist\u wheel
或其他选项打包产品。或者进行“开发”安装。设置一个python虚拟环境,当您想要测试时,在这个目录的根目录下执行pip install-e.
(“可编辑”设置它,以便python从这个本地目录而不是常规的python模块目录获取您的包)。现在,类似于nose
或pytest
的东西可以扫描树中任何名为test_xxx.py的东西并运行它
main.py
、脚本和各种测试模块都将
import foopackage.helpers as helpers
src/services/faz.py将
from .. import helpers
Python打包是一门黑暗的艺术,但极简主义的setup.py
则是如此
#!/usr/bin/env python
from setuptools import find_packages, setup
setup(
name='foopackage',
version='1.0.0',
description='Foo all the Bars',
packages=find_packages('src'),
package_dir={'': 'src'},
scripts=['src/scripts/main.py']
)
谢谢我是python新手。那么,在这个场景中,执行“main.py”的正确方法是什么?它是否像python./src/scripts/main.py那样简单?或者,还有更好的方法吗?这取决于操作系统和安装方式。如果您在unix系统上,请添加
#/usr/bin/env python
到main的顶部,chmod+x main.py
然后pip安装
,它将被复制到~/.local/bin
,您只需键入main.py
。如果使用setup.py执行pip安装-e…
或“开发”安装,则可以将脚本路径添加到本地路径变量中,并执行相同的操作。再次感谢。在mymain.py
中,我使用什么路径导入foopackage/helpers/foo
?