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
My
src/main.py

导入帮助程序
f=helpers.Foo()
我的
测试/助手/test\u foo.py

将src.helpers导入为帮助程序
def test_foo():
f=helpers.Foo()
所有这些都有效

但是,我的问题是,比如说,
src\services\faz.py
references
src\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…
或“开发”安装,则可以将脚本路径添加到本地路径变量中,并执行相同的操作。再次感谢。在my
main.py
中,我使用什么路径导入
foopackage/helpers/foo