Scripts目录是Python中的反模式吗?如果是这样,进口的正确方法是什么?

Eli*_*Eli 15 python python-2.7

我总是在我构建的每个项目中创建脚本目录,因为它们对于不经常使用的可执行脚本非常有用.在Python中,我总是会__init__.py在我的脚本目录中放置一个脚本,因此我可以将脚本作为包运行(即python -m scripts.some_scripts)并从姐妹目录中加载模块.基于这个以及谷歌搜索,我开始觉得这是一个反模式.

那说,给定一个像这样的结构:

project_dir/
    some_modules_dir/
        foo.py
        bar.py
        ...
    scripts/
        some_script.py
        other_script.py
        ...
Run Code Online (Sandbox Code Playgroud)

什么是运行脚本的正确方法,以及从姐妹目录导入脚本的正确方法是some_modules_dir什么?应该包含哪些dirs __init__.py,哪些不应该包含哪些?我想尽可能地遵循PEP8,并希望尽可能简化运行脚本.如果拥有一个脚本目录本身就是不可取的,那么你们又做了什么呢?

iva*_*eev 5

问题中的链接仅说明运行在程序包目录中的脚本,这是一个潜在的问题,因为...好吧...程序包不是脚本,脚本不是程序包。它们具有不同的用途,并且以不同的方式调用,因此,如果将它们混合在一起,有时会一团糟。

由于Python 本身已有一个Scripts目录存在很长时间了,而且没有人抱怨,所以它绝不是一种反模式。

请参阅如何将可执行文件与库文件分开?关于我在上一份工作中如何处理可执行脚本。它从未引起我所知道的任何问题。


dec*_*ion 3

就我个人而言,__init__.py在脚本中添加一个目录感觉有点不对劲,但我也可以理解为什么它在这里(以及在 IDE 中)很有用。

也就是说,如果它们已经作为 Python 模块运行,那么它们可能不是真正的脚本,无论这意味着什么(相关:你对这些文件有 shebang 吗?)。没有上下文很难说,但也许它们更接近工具模块,构成整个 Python 代码库的一部分。

在这种情况下,通过添加__init__.py项目级别(project_dir在您的示例中),您可以在您的脚本中使用正常导入:

from some_modules_dir import foo
Run Code Online (Sandbox Code Playgroud)

这意味着你的原创绝对python -m scripts.some_script(抱歉)有意义......