如何编写Python模块/包?

yow*_*ita 353 python python-module python-2.7

我一直在为工作中的简单任务制作Python脚本,从来没有真正打扰包装它们以供其他人使用.现在我被分配为REST API创建一个Python包装器.我完全不知道如何开始,我需要帮助.

是)我有的:

(只是想尽可能具体)我已经准备好了virtualenv,它也在github中,python的.gitignore文件也是,还有用于与REST API交互的请求库.而已.

这是当前目录树

.
??? bin
?   ??? /the usual stuff/
??? include
?   ??? /the usual stuff/
??? lib
?   ??? python2.7
?       ??? /the usual stuff/
??? local
?   ??? /the usual stuff/
??? README.md

27 directories, 280 files
Run Code Online (Sandbox Code Playgroud)

我甚至不知道把.py文件放到哪里,如果我做的话.

我想做什么:

使用"pip install ..."安装python模块

如果可能的话,我想要编写Python模块的一般步骤.

Anu*_*nuj 407

模块是包含Python定义和语句的文件.文件名是带有后缀的模块名称.py

hello.py然后创建以下函数作为其内容:

def helloworld():
   print "hello"
Run Code Online (Sandbox Code Playgroud)

然后你可以导入hello:

>>> import hello
>>> hello.helloworld()
'hello'
>>>
Run Code Online (Sandbox Code Playgroud)

要将许多.py文件分组,请将它们放在文件夹中.任何具有__init__.pya的文件夹都被python视为模块,您可以将它们称为包

|-HelloModule
  |_ __init__.py
  |_ hellomodule.py
Run Code Online (Sandbox Code Playgroud)

您可以通常的方式在模块上使用import语句.

有关更多信息,请参见6.4.包裹.

  • 最后一个是:来自HellowModule导入hellomodule?这可能是你在模块文件夹中的问候,所以它会来自HelloModule import hello (6认同)

arc*_*don 225

Python 3 - 2015年11月18日更新

找到有用的答案,但希望根据我自己的经验扩展几个点,以造福他人.

模块:模块是包含Python定义和语句的文件.文件名是附加后缀.py的模块名称.

模块示例:假设我们在当前目录中有一个python脚本,这里我称之为mymodule.py

文件mymodule.py包含以下代码:

def myfunc():
    print("Hello!")
Run Code Online (Sandbox Code Playgroud)

如果我们从当前目录运行python3解释器,我们可以通过以下不同方式导入和运行myfunc函数(通常只选择以下之一):

>>> import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mymodule import myfunc
>>> myfunc()
Hello!
>>> from mymodule import *
>>> myfunc()
Hello!
Run Code Online (Sandbox Code Playgroud)

好的,这很容易.

现在假设您需要将此模块放入其自己的专用文件夹中以提供模块命名空间,而不是仅从当前工作目录中临时运行它.这是值得解释的概念的地方.

:包是一种使用"点模块名称"构造Python模块命名空间的方法.例如,模块名称AB在名为A的包中指定名为B的子模块.就像使用模块保存不同模块的作者不必担心彼此的全局变量名一样,使用点模块名称可以保存作者NumPy或Python Imaging Library等多模块软件包不必担心彼此的模块名称.

包示例:现在假设我们有以下文件夹和文件.这里,mymodule.py与之前相同,__ init__.py是一个空文件:

.
??? mypackage
    ??? __init__.py
    ??? mymodule.py
Run Code Online (Sandbox Code Playgroud)

需要__init__.py文件才能使Python将目录视为包含包.有关详细信息,请参阅稍后提供的模块文档链接.

我们当前的工作目录比名为mypackage的普通文件夹高一级

$ ls
mypackage
Run Code Online (Sandbox Code Playgroud)

如果我们现在运行python3解释器,我们可以通过以下不同的方式导入并运行包含所需函数myfunc的模块mymodule.py(通常只选择以下之一):

>>> import mypackage
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> import mypackage.mymodule
>>> mypackage.mymodule.myfunc()
Hello!
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mypackage.mymodule import myfunc
>>> myfunc()
Hello!
>>> from mypackage.mymodule import *
>>> myfunc()
Hello!
Run Code Online (Sandbox Code Playgroud)

假设Python 3,有很好的文档:模块

关于包和模块的命名约定,PEP-0008中给出了一般指导原则 - 请参阅包和模块名称

模块应具有简短的全小写名称.如果提高可读性,则可以在模块名称中使用下划线.Python包也应该有简短的全小写名称,但不鼓励使用下划线.

  • 剩下的唯一问题是如何让包导入`import mypackage`中的所有内容?将`import mymodule`添加到`__init __.py`不起作用.. (5认同)
  • 很简单的解释.如果你想在mypackage中保留另一个文件夹怎么办? (4认同)
  • 包含完全取决于你写的内容.如果你把函数放在模块的函数外面,你会在调用`import mypackage`时触发它.如果您想从模块(甚至文件)导入一个函数,最好使用`from module import function`.在子文件夹`from subfolder.module import function`的情况下,你可以简单地调用`function()`来解雇其他代码部分.另外,如果你真的不需要,请不要使用`from module import*`. (3认同)
  • pip怎么样? (2认同)

bgs*_*gse 183

既然没有人确实涵盖OP的这个问题:

我想做什么:

使用"pip install ..."安装python模块

这是一个绝对最小的例子,显示了使用setuptools和准备和上传包到PyPI的基本步骤twine.

这绝不是替代至少阅读本教程的内容,除了这个非常基本的例子之外,它还有很多内容.

这里的其他答案已经涵盖了创建包本身,所以让我们假设我们已经涵盖了这一步,我们的项目结构如下:

.
??? hellostackoverflow/
    ??? __init__.py
    ??? hellostackoverflow.py
Run Code Online (Sandbox Code Playgroud)

为了setuptools用于打包,我们需要添加一个文件setup.py,这将进入我们项目的根文件夹:

.
??? setup.py
??? hellostackoverflow/
    ??? __init__.py
    ??? hellostackoverflow.py
Run Code Online (Sandbox Code Playgroud)

至少,我们指定包的元数据,我们setup.py将如下所示:

from setuptools import setup

setup(
    name='hellostackoverflow',
    version='0.0.1',
    description='a pip-installable package example',
    license='MIT',
    packages=['hellostackoverflow'],
    author='Benjamin Gerfelder',
    author_email='benjamin.gerfelder@gmail.com',
    keywords=['example'],
    url='https://github.com/bgse/hellostackoverflow'
)
Run Code Online (Sandbox Code Playgroud)

由于我们已经设置license='MIT',我们在项目中包含一个副本LICENCE.txt,以及reStructuredText中的自述文件README.rst:

.
??? LICENCE.txt
??? README.rst
??? setup.py
??? hellostackoverflow/
    ??? __init__.py
    ??? hellostackoverflow.py
Run Code Online (Sandbox Code Playgroud)

此时,我们已准备好开始使用包装setuptools,如果我们尚未安装,我们可以安装它pip:

pip install setuptools
Run Code Online (Sandbox Code Playgroud)

为了做到这一点并创建一个source distribution,在我们的项目根文件夹中,我们setup.py从命令行调用我们,指定我们想要sdist:

python setup.py sdist
Run Code Online (Sandbox Code Playgroud)

这将创建我们的分发包和egg-info,并产生这样的文件夹结构,我们的包在dist:

.
??? dist/
??? hellostackoverflow.egg-info/
??? LICENCE.txt
??? README.rst
??? setup.py
??? hellostackoverflow/
    ??? __init__.py
    ??? hellostackoverflow.py
Run Code Online (Sandbox Code Playgroud)

此时,我们有一个可以安装的软件包pip,所以从我们的项目根目录开始(假设您拥有此示例中的所有命名):

pip install ./dist/hellostackoverflow-0.0.1.tar.gz
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,我们现在可以打开一个Python解释器,我会说在项目目录之外的某处,以避免任何混淆,并尝试使用我们闪亮的新包:

Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hellostackoverflow import hellostackoverflow
>>> hellostackoverflow.greeting()
'Hello Stack Overflow!'
Run Code Online (Sandbox Code Playgroud)

现在我们已确认包安装和工作,我们可以将其上传到PyPI.

由于我们不希望通过实验污染实时存储库,因此我们为测试存储库创建了一个帐户,并twine为上载过程进行安装:

pip install twine
Run Code Online (Sandbox Code Playgroud)

现在我们差不多了,创建了我们的帐户,我们只是告诉twine上传我们的包,它会要求我们的凭据并将我们的包上传到指定的存储库:

twine upload --repository-url https://test.pypi.org/legacy/ dist/*
Run Code Online (Sandbox Code Playgroud)

我们现在可以在PyPI测试存储库上登录我们的帐户,并对我们刚刚上传的软件包感叹一段时间,然后使用pip以下方法获取它:

pip install --index-url https://test.pypi.org/simple/ hellostackoverflow
Run Code Online (Sandbox Code Playgroud)

我们可以看到,基本过程并不复杂.正如我之前所说,它还有很多内容,所以请继续阅读本教程以获得更深入的解释.


小智 9

一旦定义了所选命令,就可以将保存的文件拖放到python程序文件中的Lib文件夹中.

>>> import mymodule 
>>> mymodule.myfunc()
Run Code Online (Sandbox Code Playgroud)