首页 文章

如何编写Python模块/包?

提问于
浏览
279

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

What I have:

(只是想尽可能具体)我已经准备好virtualenv,它也是up in github,python的.gitignore文件也是,加上,requests library用于与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

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

What I wanted to do:

使用“pip install ...”安装python模块

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

6 回答

  • 1

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

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

    def helloworld():
       print "hello"
    

    然后你可以导入 hello

    >>> import hello
    >>> hello.helloworld()
    'hello'
    >>>
    

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

    |-HelloModule
      |_ __init__.py
      |_ hellomodule.py
    

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

    有关更多信息,请参阅6.4. Packages .

  • 113

    Python 3 - UPDATED 18th November 2015

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

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

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

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

    def myfunc():
        print("Hello!")
    

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

    >>> import mymodule
    >>> mymodule.myfunc()
    Hello!
    >>> from mymodule import myfunc
    >>> myfunc()
    Hello!
    >>> from mymodule import *
    >>> myfunc()
    Hello!
    

    好的,这很容易 .

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

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

    Package Example :我们现在假设我们有以下文件夹和文件 . 这里, mymodule.py 与之前相同, init.py 是一个空文件:

    .
    └── mypackage
        ├── __init__.py
        └── mymodule.py
    

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

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

    $ ls
    mypackage
    

    如果我们现在运行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!
    

    假设Python 3,有以下优秀文档:Modules

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

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

  • 181

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

    我想做的事:使用“pip install ...”安装python模块

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

    This is by no means a substitute for reading at least the tutorial, there is much more to it than covered in this very basic example.

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

    .
    └── hellostackoverflow/
        ├── __init__.py
        └── hellostackoverflow.py
    

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

    .
    ├── setup.py
    └── hellostackoverflow/
        ├── __init__.py
        └── hellostackoverflow.py
    

    我们至少指定了包的元数据, 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'
    )
    

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

    .
    ├── LICENCE.txt
    ├── README.rst
    ├── setup.py
    └── hellostackoverflow/
        ├── __init__.py
        └── hellostackoverflow.py
    

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

    pip install setuptools
    

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

    python setup.py sdist
    

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

    .
    ├── dist/
    ├── hellostackoverflow.egg-info/
    ├── LICENCE.txt
    ├── README.rst
    ├── setup.py
    └── hellostackoverflow/
        ├── __init__.py
        └── hellostackoverflow.py
    

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

    pip install ./dist/hellostackoverflow-0.0.1.tar.gz
    

    如果一切顺利,我们现在可以打开一个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!'
    

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

    由于我们不想通过实验污染实时存储库,因此我们为testing repository创建了一个帐户,并为上传过程安装了 twine

    pip install twine
    

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

    twine upload --repository-url https://test.pypi.org/legacy/ dist/*
    

    我们现在可以在PyPI测试存储库上登录我们的帐户,并对我们刚刚上传的软件包感到惊讶,然后使用 pip 获取它:

    pip install --index-url https://test.pypi.org/simple/ hellostackoverflow
    

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

  • 349

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

    >>> import mymodule 
    >>> mymodule.myfunc()
    
  • 7

    创建一个名为“hello.py”的文件

    如果您使用的是Python 2.x.

    def func():
        print "Hello"
    

    如果您使用的是Python 3.x.

    def func():
        print("Hello")
    

    运行该文件 . 然后,您可以尝试以下方法:

    >>> import hello
    >>> hello.func()
    Hello
    

    如果你想要一点点努力,你可以使用以下内容:

    如果您使用的是Python 2.x.

    def say(text):
        print text
    

    如果您使用的是Python 3.x.

    def say(text):
        print(text)
    

    请参阅define旁边的括号中的一个?这很重要 . 它是您可以在定义中使用的那个 .

    文本 - 当您希望程序说出您想要的内容时,可以使用它 . 根据它的名字,它是文字 . 我希望你知道文字是什么意思 . 它的意思是“单词”或“句子” .

    运行该文件 . 然后,如果您使用的是Python 3.x,则可以尝试以下操作:

    >>> import hello
    >>> hello.say("hi")
    hi
    >>> from hello import say
    >>> say("test")
    test
    

    对于Python 2.x - 我猜Python 3是一样的吗?不知道 . 如果我在Python 2.x上犯了错误,请纠正我(我知道Python 2,但我使用的是Python 3)

  • 3

    I created a project to easily initiate a project skeleton from scratch . https://github.com/MacHu-GWU/pygitrepo-project .

    你可以创建一个测试项目,比方说, learn_creating_py_package .

    You can learn what component you should have for different purpose like

    • 创建virtualenv

    • 安装自己

    • 运行unittest

    • 运行代码覆盖率

    • 构建文档

    • 部署文档

    • 在不同的python版本中运行unittest

    • 部署到PYPI

    使用 pygitrepo 的好处是那些乏味的东西会自动创建并适应你的 package_nameproject_namegithub_accountdocument host servicewindows or macos or linux .

    这是一个学习像专业人士一样开发python项目的好地方 .

    希望这可以帮助 .

    谢谢 .

相关问题