代码之家  ›  专栏  ›  技术社区  ›  phihag

如何模块化Python应用程序

  •  5
  • phihag  · 技术社区  · 15 年前

    我有许多使用通用定义的脚本。如何将它们拆分为多个文件?此外,在我的场景中,应用程序不能以任何方式安装;必须能够同时运行任意数量的版本,并且必须在没有超级用户权限的情况下工作。我想到的解决方案是:

    • 重复代码 在每一个 脚本。凌乱,可能是最糟糕的 方案。
    • 将所有脚本和公用 单个目录中的代码, 和 使用 from . import 加载它们。 这种方法的缺点是 我想把我的图书馆放在别的地方 目录比应用程序。
    • 放普通 在自己的目录中编码 写一篇 __init__.py 导入所有子模块并最终使用 从…进口 加载它们。 保持代码的条理化,但维护起来有点开销 π介子 并限定名称。
    • 将库目录添加到 sys.path import . 我倾向于 但我不确定 摆弄 搜索路径 很好的代码。
    • 负载使用 execfile ( exec 在Python 3中)。 结合了 前两种方法:只有一种 每个模块所需的线路,我可以使用 专用的。另一方面,这个 避开了python模块的概念 polutes全局命名空间。
    • 使用编写和安装模块 distutils . 这个 为所有python安装库 脚本并需要超级用户权限 并影响其他应用程序,因此不适用于我的情况。

    最好的方法是什么?

    5 回复  |  直到 15 年前
        1
  •  8
  •   bobince    15 年前

    添加到sys.path(通常使用site.addsitedir)是非常常见的,并不特别不受欢迎。当然,您会希望您的公共工作共享资料放在模块中的某个方便的地方。

    如果您使用的是python 2.6+,那么已经有了一个用户级模块文件夹,您可以不用添加到sys.path或python path。它是~/.local/lib/python2.6/site-packages on unix likes-请参见 PEP 370 更多信息。

        2
  •  4
  •   sth Alien    15 年前

    您可以设置 PYTHONPATH 库文件所在目录的环境变量。这会将该路径添加到库搜索路径,您可以使用 import 导入它们。

        3
  •  3
  •   Daniel Naab    15 年前

    如果您有多个具有各种依赖项组合的环境,那么一个好的解决方案是使用 virtualenv 要创建沙盒Python环境,每个环境都有自己的一组已安装的包。每个环境的运行方式与系统范围内的Python站点包设置相同,但创建本地环境不需要超级用户权限。

    谷歌有 plenty of info 但是 this 看起来是个不错的起点。

        4
  •  1
  •   dF.    15 年前

    手动将路径添加到 sys.path 是使用环境变量 PYTHONPATH .

    也, distutils 允许您使用指定自定义安装目录

     python setup.py install --home=/my/dir 
    

    但是,如果需要让多个版本同时运行,并且具有相同的模块名称,那么这两种方法都不可行。在这种情况下,你最好修改一下 搜索路径 .

        5
  •  1
  •   Can Berk Güder Pugalmuni    15 年前

    我使用了第三种方法(将目录添加到 sys.path )对于多个项目,我认为这是一个有效的方法。