2013-04-01 60 views
213

我已经作出Python脚本在工作中简单的任务,从来没有真正困扰它们打包供他人使用。现在我已经被分配到一个REST API的Python包装器。我完全不知道如何开始,我需要帮助。如何编写Python模块?

我有什么:

(只是想具体越好)我有virtualenv准备好了,这也是up in github,为蟒蛇的.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文件,如果我做一个。

我想做的事:

做一个Python模块安装,能够与“画中画安装...”

如果可能的话,我想推进的过程编写Python模块的一般步骤。

+10

我会从[教程的第6章(2.7)](http://docs.python.org/2/tutorial/modules.html)或[here for 3.x](http:// docs.python.org/3/tutorial/modules.html)在[python模块教程](http://www.google.com/search?q=python+module+tutorial)搜索互联网,你会发现很多别人的。 –

+1

没有人回答pip部分 –

回答

283

模块是包括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

+3

会最后一个是:从HellowModule导入hellomodule?这可能是模块文件夹中的你好,所以它会从HelloModule导入hello – nycynik

+3

不显示如何上传到pip –

145

的Python 3 - 更新2015年11月18日

找到接受的答案是有用的,但希望在几个点根据我自己的经验,别人的利益扩大。

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

模块实例:假设我们有一个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! 

好的,这很容易。

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

软件包:软件包是一种通过使用“虚线模块名称”来构造Python模块名称空间的方法。例如,模块名称AB在名为A的包中指定名为B的子模块。就像模块的使用一样,不同模块的作者不必担心彼此的全局变量名称,使用虚线模块名称可以节省作者像NumPy或Python Imaging Library这样的多模块软件包不必担心彼此的模块名称。

包示例:现在假设我们有以下文件夹和文件。在这里,mymodule.py是相同的面前,__init__.py是一个空文件:

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

的__init__.py文件,才能使Python视该目录为一个包。有关更多信息,请参阅稍后提供的模块文档链接。

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

$ ls 
mypackage 

如果我们现在运行python3解释,我们可以导入和运行模块mymodule.py包含所需的功能MYFUNC在以下不同的方式(你通常只选择下列之一):

>>> 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包也应该有简短的全小写名称。

+1

很好的简单解释。如果你想保留mypackage内的另一个文件夹怎么办? –

+2

包含完全取决于您所写的内容。在你将模块外部的东西放在函数之外的情况下,当你像调用'import mypackage'一样调用的时候,它会触发它。如果你想从模块导入一个函数(甚至是文件),最好使用'from module import function'。在子文件夹'from subfolder.module import function'中,这样你就可以简单地调用'function()',而不会触发其他代码部分。另外,如果你真的不需要,不要使用'from module import *'。 – erm3nda

+2

剩下的唯一问题是,如何让包导入“import mypackage”中的所有内容?将'import mymodule'添加到'__init __。py'不起作用.. – 576i

5

一旦您定义了您选择的命令,您可以简单地将保存的文件拖放到您的python程序文件的Lib文件夹中。

>>> import mymodule 
>>> mymodule.myfunc() 
+0

感谢兄弟,你的回答帮助我解决了我的问题。 – papabiceps

2

制作一个名为“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) 

参见括号中的一个旁边的定义?这很重要。这是您可以在定义中使用的那个。

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

运行该文件。 - 我想同样的事情,与Python 3

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

对于Python 2.x的:然后,你可以,如果你正在使用Python 3.x的请尝试以下操作?不知道。纠正我,如果我在的Python 2.x中犯了一个错误(我知道的Python 2,但我与Python 3中使用)

28

因为没有人做过覆盖OP的这个问题尚未:

我想什么要做到:

做一个Python模块安装,能够与“画中画安装...”

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

这绝不是reading at least the tutorial的替代品,它比这个非常基本的例子中涵盖的要多得多。

创建包本身已经被其他的答案覆盖在这里,让我们假设我们有一个步覆盖,我们的项目结构是这样的:

. 
└── 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='[email protected]', 
    keywords=['example'], 
    url='https://github.com/bgse/hellostackoverflow' 
) 

既然我们已经设置license='MIT',我们包括为LICENCE.txt项目副本,一起在新结构化自述文件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 

这将创建我们的分发包和蛋的信息,并导致在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笔账EST库,并在我们新上传包了一阵惊叹,然后用pip抓住它:

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

正如我们所看到的,基本的过程也不是很复杂。正如我刚才所说,除此之外还有很多其他的内容,所以请继续阅读read the tutorial以获得更深入的解释。

+2

我最喜欢的答案,做得很好。 – sAguinaga