避免在python中使用子文件夹时导入路径



以前我在没有单元测试的情况下工作,我的项目有这个结构:

-main.py
-folderFunctions:
-functionA.py

只需在文件夹中使用初始化文件函数,然后导入

from folderFunctions import functionA

一切都很好。

现在我也有以这种方式组织的单元测试:

-main.py
-folderFunctions:
-functionA.py
-folderTest:
-testFunctionA.py

所以我必须在 functionA.py 和 testFunctionA.py 这两行中添加(为了运行 testFunctionA.py(以导入路径:

myPath = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, myPath + '../..') 

这样,测试就可以正常工作。 但这对我来说很丑陋,我想也不是很蟒蛇。 有没有办法让它更优雅?

如果您希望您的库/应用程序变得更大且易于打包,我几乎不建议将源代码与测试代码分开,因为测试代码不应该打包在二进制发行版(鸡蛋或轮子(中。

您可以遵循以下树结构:

+-- src/
|    +-- main.py
|    -- folder_functions/  # <- Python package
|        +-- __init__.py
|        -- function_a.py
-- tests/
-- folder_functions/
+-- __init__.py
-- test_function_a.py

注意:根据PEP8,Python包和模块名称应该在"蛇大小写"(小写+下划线(。

如果您有(并且应该(一个主包,则可以避免使用src目录。

如其他注释中所述,setup.py 文件应位于srctests文件夹(根级别(旁边。

阅读 Python 打包用户指南

编辑

下一步是创建一个setup.py,例如:

from setuptools import find_packages
from setuptools import setup
setup(
name='Your-App',
version='0.1.0',
author='Your Name',
author_email='your@email',
url='URL of your project home page',
description="one line description",
long_description='long description ',
classifiers=[
'Development Status :: 4 - Beta',
'Intended Audience :: Developers',
'License :: OSI Approved :: Python Software Foundation License',
'Operating System :: MacOS :: MacOS X',
'Operating System :: Microsoft :: Windows',
'Operating System :: POSIX',
'Programming Language :: Python',
'Topic :: Software Development',
],
platforms=["Linux", "Windows", "OS X"],
license="MIT License",
keywords="keywords",
packages=find_packages("src"),
package_dir={'': 'src'},
entry_points={
'console_scripts': [
'cmd_name = main:main',
],
})

配置项目后,您可以创建一个虚拟环境并在其中安装您的应用程序:

virtualenv your-app
source your-app/bin/activate
pip install -e .

您可以使用 unitests 标准模块运行测试。

要在test_function_a.py中导入模块,只需照常进行:

from folder_functions import function_a

更优雅的方法是from folderFunctions.folderTest import testFunctionA并确保在folderTest目录中有一个__init__.py文件。你也可以看看这个问题

相关内容

  • 没有找到相关文章

最新更新