2

我正在考虑如何安排一个已部署的 python 应用程序,该应用程序将具有

  1. 位于 /usr/bin/ 中的可执行脚本,它将为实现的功能提供 CLI
  2. 安装到当前站点包目录所在位置的库。

现在,目前,我的源代码中有以下目录结构:

foo.py
foo/
  __init__.py
  ...

我想这不是做事的最佳方式。在开发过程中,一切都按预期工作,但是在部署时,foo.py 中的“from foo import FooObject”代码似乎试图导入 foo.py 本身,这不是我正在寻找的行为。

所以问题是编排这种情况的标准做法是什么?我能想到的一件事是,在安装时,将 foo.py 重命名为 foo,这会阻止它自行导入,但这似乎很尴尬......

我想,问题的另一部分是命名挑战。也许调用可执行脚本 foo-bin.py?

4

4 回答 4

5

这篇文章很不错,向你展示了一个很好的方法。Do列表中的第二项回答了您的问题。

无耻的复制粘贴:

Python项目的文件系统结构

通过Jp Calderone

做:

  • 将目录命名为与您的项目相关的名称。例如,如果您的项目名为“Twisted”,请将其源文件的顶级目录命名为Twisted。当你发布时,你应该包含一个版本号后缀:Twisted-2.5.
  • 创建一个目录Twisted/bin并将您的可执行文件放在那里,如果有的话。不要给它们.py 扩展名,即使它们是 Python 源文件。除了导入和调用项目中其他地方定义的主函数外,不要在其中放置任何代码。
  • 如果您的项目可以表示为单个 Python 源文件,则将其放入目录中,并将其命名为与您的项目相关的名称。例如,Twisted/twisted.py。如果您需要多个源文件,请改为创建一个包(Twisted/twisted/, 为空 Twisted/twisted/__init__.py)并将源文件放入其中。例如, Twisted/twisted/internet.py
  • put your unit tests in a sub-package of your package (note - this means that the single Python source file option above was a trick - you always need at least one other file for your unit tests). For example, Twisted/twisted/test/. Of course, make it a package with Twisted/twisted/test/__init__.py. Place tests in files like Twisted/twisted/test/test_internet.py.
  • add Twisted/README and Twisted/setup.py to explain and install your software, respectively, if you're feeling nice.

Don't:

  • put your source in a directory called src or lib. This makes it hard to run without installing.
  • put your tests outside of your Python package. This makes it hard to run the tests against an installed version.
  • create a package that only has a __init__.py and then put all your code into __init__.py. Just make a module instead of a package, it's simpler.
  • try to come up with magical hacks to make Python able to import your module or package without having the user add the directory containing it to their import path (either via PYTHONPATH or some other mechanism). You will not correctly handle all cases and users will get angry at you when your software doesn't work in their environment.
于 2008-12-02T10:57:19.790 回答
2

Distutils支持安装模块、包和脚本。如果您创建一个作为包和脚本setup.py引用的 distutils ,那么应该安装到目标操作系统上的适当脚本安装路径或任何适当的脚本安装路径,并且包应该安装到目录中。foofoo.pyfoo.py/usr/local/binfoosite_packages

于 2008-11-30T07:30:01.470 回答
0

您应该调用可执行文件 just foo, not foo.py,然后尝试导入 foo 将不会使用它。

至于正确命名:这很难抽象地回答;我们需要知道它具体做了什么。例如,如果它配置和控制,调用它 -config 或 ctl 可能是合适的。如果它是库的外壳 API,它应该与库具有相同的名称。

于 2008-11-30T07:18:10.420 回答
0

你的 CLI 模块是一回事,支持它的包是另一回事。不要将名称与模块foo(在文件中foo.py)和包foo(在foo带有文件的目录中)混淆__init__.py

你有两个东西叫做foo:一个模块和一个包。你还想叫什么名字foo?一类?一个函数?一个变量?

为 foo 模块或 foo 包选择一个独特的名称。 foolib,例如,是一个流行的包名称。

于 2008-11-30T12:47:16.323 回答