当前位置: 首页 > 面试题库 >

Python项目目录结构/ pytest麻烦

端木夕
2023-03-14
问题内容

这应该是地球上最简单的问题,但是即使经过广泛的搜索和修补,我仍然在寻找一种“正确的”方式来放置目录结构并设法正确运行pytest等方面深陷困境。

假设我有一个名为apple的程序。

|- README.md
|- apple
|   |-- __init__.py
|   |-- apple.py
| - tests
|   |-- test_everything.py

apple.py包含一些函数,为方便起见,我们将其称为一个eat()。该test_everything.py文件包含一些测试,例如assert eat()=="foobar"。太好了,太容易了,但是乐趣就开始了:

  • 怎么样__init__.py在苹果目录…正确吗?空或里面应该有什么?
  • py.test从根目录调用是最佳实践吗?还是py.test tests
  • 许多项目__init__.py的测试目录中都有一个,但是在py.test文档中明确指出这是错误的。那为什么上帝啊
  • test_everything.py文件顶部的内容是:import applefrom apple import *?或完全其他的东西
  • 您是否通过eat()或调用了这些函数apple.eat()
  • 一些人甚至建议os.path.dirname在python中进行操作

这应该很容易,但是我已经看到了上面的每种组合,甚至都没有谈论过tox和无数其他工具。然而,即使有丝毫错误,您也会抛出一些ImportError: No module named 'apple'或其他一些时髦的错误。

什么是“正确”方式?该建议和github等上的现有代码遵循极为不同的约定。对于经验丰富的编码器,这应该容易得多。


问题答案:
  1. 怎么样__init__.py在苹果目录…正确吗?空或里面应该有什么?

是,对的。最经常是空的。如果放入foo = 42,您可以稍后再做from apple import foofrom apple.apple import foo如果放入,则需要做apple.py。尽管它看起来很方便,但您应该谨慎使用。

  1. 从根目录调用py.test是最佳实践吗?还是py.test测试?

py.test无论如何都应该能够找到您的测试,但请参见下文。

  1. 许多项目__init__.py的测试目录中都有一个,但是在py.test文档中明确指出这是错误的。那为什么上帝啊

因此,您可以在提供通用测试功能的测试中导入文件。在py.test中,通过在名为的文件中创建固定装置可能会更好地实现tests/conftest.py

  1. test_everything.py文件顶部的内容是:导入苹果还是来自苹果导入*?或完全其他的东西

from apple import apple

  1. 您是否先通过eat()或apple.eat()调用函数?

apple.eat()

  1. 甚至有人建议在python中操作os.path.dirname

那似乎很脆弱。我建议

(a)将环境变量PYTHONPATH设置为指向所在的文件夹README.md,或者更好

(b)创建一个setup.py文件(与您的README.md文件处于同一级别),这是最小的文件:

from setuptools import setup
setup(name='apple', packages=['apple'])

像这样运行文件:

python setup.py develop

现在apple可以在全球范围内使用,您再也不会遇到no module named apple问题,例如,您可以从根文件夹或tests文件夹运行py.test。

您可以setup.py在https://python-packaging-user-
guide.readthedocs.org/en/latest/index.html
的《
Python打包用户指南》中了解更多信息。



 类似资料:
  • 问题内容: 我从事过maven项目,其中目录结构如下: 我想知道是否存在其他目录结构约定。此约定是Maven特定的还是适用于所有Java?我有一个需要多种编程语言的项目,并对是否存在某种标准感到好奇。 问题答案: 它是Maven特定的目录结构约定,但是它在Maven领域之外也很流行,因为它很好(就像其他有意义的约定一样),没有理由不将其与Ant管理的项目一起使用常规Java项目。甚至项目的Java

  • 当默认的项目结构不适用时,可以自定义配置。查看 Gradle 文档中 Java plugin 部分以了解如何在纯 Java 项目中进行配置。 Android plugin 使用了类似的语法,但因为 Android 有自己的 sourceSets,所以需要配置到 android 块中。下面的例子使用了旧的项目结构(Eclipse),并把 androidTest 的 sourceSet 映射到 tes

  • 前言 这一篇,我们将接着上篇来完成创建项目文件、目录结构。 回顾 先回顾一下现在项目有哪些东西了: . ├── app │   ├── app.vue │   ├── common │   │   ├── img │   │   ├── js │   │   └── scss │   ├── index.html │   ├── index.js │   ├── router

  • 主要内容:什么是目录?什么是目录? 目录可以被定义为磁盘上相关文件的列表。 该目录可以存储一些或整个文件属性。 为了在不同的操作系统上获得不同文件系统的好处,可将硬盘划分为不同大小的分区数。 分区也称为卷或小型磁盘。 每个分区必须至少有一个目录,其中可以列出分区的所有文件。 为目录中的每个文件维护一个目录条目,该目录存储与该文件相关的所有信息。 一个目录可以被视为一个文件,其中包含一堆文件的元数据。每个目录都支持文件上

  • 根目录 在 sbt 术语中 “根目录”是一个包含项目的目录,所以如果创建一个 hello 项目将包含 hello/build.sbt 和 hello/hw.scala 在 hello world 项目例子中,其中hello是根目录 源代码目录结构 源代码可以放到项目的根目录类似于 hello/hw.scala , 但是在真正的项目很少利用这样的代码结构,这样会使项目变得混乱, sbt 的项目目录结

  • Jekyll 的核心其实是一个文本转换引擎。它的概念其实就是:你用你最喜欢的标记语言来写文章,可以是 Markdown, 也可以是 Textile, 或者就是简单的 HTML, 然后 Jekyll 就会帮你套入一个或一系列的布局中。在整个过程中你可以设置 URL 路径,你的文本在布局中的显示样式等等。这些都可以通过纯文本编辑来实现,最终生成的静态页面就是你的成品了。 一个基本的 Jekyll 网站