如何使用python包,模块等编写自定义解决方案

时间:2010-05-21 12:53:38

标签: python

我正在写一个包装模板foobar,包括模块alice,bob,charles和david。

根据我对Python包和模块的理解,这意味着我将创建一个文件夹foobar,包含以下子目录和文件(如果我错了,请更正)

foobar/
  __init__.py
  alice/alice.py
  bob/bob.py
  charles/charles.py
  david/david.py

包应该是可执行的,所以除了使模块alice,bob等可用作'库'之外,我还应该能够在这样的脚本中使用foobar:

python foobar --args = someargs

问题1:

包可以在上面描述的脚本中可执行并使用吗?

问题2

各种模块将使用我想重构的代码到公共库中。这是否意味着创建一个新的子目录'foobar / common'并将common.py放在该文件夹中?

问题3

模块如何导入公共模块? 它是'来自foobar import common'还是我不能使用它,因为这些模块是包的一部分?

问题4

我想在脚本中使用foobar包时添加逻辑(假设可以这样做 - 我只看到它为模块完成)

使用的代码如下:

if __name__ == "__main__":
  dosomething()

我将(在哪个文件中)放入这个逻辑?

1 个答案:

答案 0 :(得分:0)

  

包可以变成可执行的吗?   在我描述的脚本中使用   以上?

Q1和Q4 。是的,请放置您的:

if __name__ == "__main__":
  dosomething()
foobar/__init__.py

中的

  

Q2 各种模块将使用代码   我想重构一个共同点   图书馆。这是否意味着创造一个新的   子目录'foobar / common'和   将common.py放在该文件夹中?

不,您必须创建foobar/common.py,而不是foobar/common/common.py。所有模块都是如此。因此,正确的结构是:

foobar/
  __init__.py
  alice.py
  bob.py
  charles.py
  common.py
  david.py

做你正在做的事情你正在创建包foobar,子包alice和模块alice等等。这不是我想要的。此外它根本不起作用,因为如果目录中包含__init__.py,并且您没有在子目录中创建它们,则目录将成为Python包。

  

Q3 模块如何导入   常用模块?是from foobar import common

没错。您也可以简单地使用import common但是如果您的库将在具有名为common的自己的模块/包的项目中使用,则可能会导致冲突。所以我更喜欢使用完全合格的模块名称。