파이썬 모듈 / 패키지를 작성하는 방법?


375

나는 직장에서 간단한 작업을 위해 Python 스크립트를 만들었고 다른 사람들이 사용할 수 있도록 포장하지 않았습니다. 이제 REST API 용 Python 래퍼를 만들도록 지정되었습니다. 시작하는 방법을 전혀 몰라 도움이 필요합니다.

내가 가진 것 :

(가능한 한 구체적으로하고 싶습니다) virtualenv 가 준비되어 있으며 github 에도 있습니다. 파이썬의 .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

.py 파일을 어디에 넣을 지조차 모르겠습니다.

내가하고 싶은 것 :

"pip install ..."으로 파이썬 모듈을 설치 가능하게 만드십시오.

가능하다면 파이썬 모듈 작성에 대한 일반적인 단계별 프로세스를 원합니다.


15
튜토리얼 (2.7)의 6 장 부터 시작 하거나 여기에서 3.x를 참조하십시오. 파이썬 모듈 튜토리얼을 인터넷에서 검색하면 다른 많은 것들을 찾을 수 있습니다.
Roland Smith

6
아무도 핍 부분에 대답하지 않았습니다
whackamadoodle3000

github.com/MacHu-GWU/pygitrepo-project 이 라이브러리는 처음부터 프로젝트 스켈레톤을 생성하는 데 도움이되며 필요한 기능은 기본적으로 제공 됩니다.
MacSanhe

답변:


424

모듈은 파이썬 정의와 문장을 포함하는 파일입니다. 파일 이름은 접미사가있는 모듈 이름입니다..py

작성 hello.py내용으로 다음과 같은 함수를 작성 후 :

def helloworld():
   print "hello"

그런 다음 가져올 수 있습니다 hello.

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

많은 .py파일 을 그룹화하려면 폴더에 넣으십시오. 가있는 폴더 __init__.py는 파이썬에서 모듈로 간주되며 패키지라고 할 수 있습니다

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

일반적인 방법으로 모듈의 import 문을 사용할 수 있습니다.

자세한 내용은 6.4를 참조하십시오 . 패키지 .


7
마지막은 HellowModule에서 hellomodule을 가져 오는 것입니까? 모듈 폴더에있을 수 있으므로 HelloModule에서 가져옵니다. hello
nycynik

현재 파이썬으로 놀고 있으며이 대답은 내가 만난 가장 도움이되는 것 중 하나 여야합니다. 잘 설명합니다, 감사합니다
대런 웨인 라이트

"pip install"명령이 작동하지 않습니다. 또한 사용하려면 동일한 디렉토리에 있어야합니다.
Math Coder 101

234

Python 3-2015 년 11 월 18 일 업데이트

인정 된 답변이 유용하다는 것을 알았지 만 내 경험에 따라 다른 사람들의 이익을 위해 여러 가지 점을 확대하고자했습니다.

모듈 : 모듈은 파이썬 정의와 문장을 포함하는 파일입니다. 파일 이름은 접미사 .py가 추가 된 모듈 이름입니다.

모듈 예제 : 현재 디렉토리에 단일 파이썬 스크립트가 있다고 가정합니다. 여기서 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 파일은 파이썬이 디렉토리를 패키지를 포함하는 것으로 취급하도록하는데 필요합니다. 자세한 내용은 나중에 제공되는 모듈 설명서 링크를 참조하십시오.

현재 작업 디렉토리는 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!

파이썬 3 가정에서 훌륭한 문서가있다 : 모듈

패키지 및 모듈의 명명 규칙과 관련하여 일반적인 지침은 PEP-0008에 나와 있습니다. 패키지 및 모듈 이름을 참조하십시오

모듈은 짧은 소문자 이름을 가져야합니다. 가독성을 높이려면 모듈 이름에 밑줄을 사용할 수 있습니다. 밑줄은 사용하지 않는 것이 좋지만 파이썬 패키지는 소문자로 된 짧은 소문자 이름을 가져야합니다.


5
좋은 간단한 설명. mypackage 안에 다른 폴더를 유지하려면 어떻게해야합니까?
Anuj Gupta

3
포함은 전적으로 작성한 내용에 따라 다릅니다. 모듈의 함수 외부에 물건을 넣은 경우처럼 호출하면 해당 함수를 시작합니다 import mypackage. 모듈 (파일조차도)에서 함수 만 가져 오려면을 사용하는 것이 좋습니다 from module import function. 하위 폴더의 경우 다른 코드 부분을 실행하기 from subfolder.module import function만하면 function()됩니다. 또한 from module import *실제로 필요하지 않은 경우 사용 하지 마십시오.
m3nda

5
남은 유일한 질문은 패키지를 가져 와서 모든 것을 가져올 수 import mypackage있습니까? 추가 import mymodule로하는 것은 __init__.py작동하지 않습니다 ..
576i와

깔끔한 설명! 그러나 numpy가 패키지인지 여부에 대한 질문이 있습니다. 통역사에서 numpy.cos (1)을 어떻게 실행할 수 있습니까? 아니?
user1935724 2016 년

3
핍은 어때?
whackamadoodle3000

199

아직 OP에 대한이 질문을 아무도 다루지 않았으므로 :

내가하고 싶은 것 :

"pip install ..."으로 파이썬 모듈을 설치 가능하게 만드십시오.

여기서 절대 최소한 예 및 제조에 사용 PyPI 패키지를 업로드하는 기본 단계를 도시한다 setuptoolstwine.

이것은 최소한 튜토리얼을 대체 할 수있는 것은 아니며 ,이 기본 예제에서 다루는 것보다 훨씬 더 많은 것이 있습니다.

패키지 자체를 만드는 것은 이미 여기에 다른 답변으로 덮여 있으므로 단계와 프로젝트 구조를 다음과 같이 가정합니다.

.
└── 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.txtreStructuredText의 readme 파일과 함께 다음과 같이 프로젝트에 사본을 포함합니다 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 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에 업로드 할 수 있습니다.

실험으로 라이브 저장소를 오염시키지 않기 위해 테스트 저장소에 대한 계정을 작성 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

우리가 볼 수 있듯이 기본 프로세스는 그리 복잡하지 않습니다. 앞서 말했듯이 여기에서 다루는 것보다 훨씬 더 많은 것이 있으므로 자세한 설명 은 자습서읽으십시오 .


패키지가 바로 게시 setuptools되나요?
U10-Forward

@ U9-Forward 아니요, 게시는으로 완료 twine되지만 패키지를 만든 후 게시하기 전에 로컬로 패키지를 테스트 할 수 있습니다 setuptools.
bgse

9

선택한 명령을 정의한 후에는 저장된 파일을 파이썬 프로그램 파일의 Lib 폴더로 끌어다 놓기 만하면됩니다.

>>> import mymodule 
>>> mymodule.myfunc()

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)

define 옆의 괄호에있는 것을 보시겠습니까? 중요합니다. 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과 함께 사용됩니다)


2

프로젝트 스켈레톤을 처음부터 쉽게 시작할 수있는 프로젝트를 만들었습니다 . https://github.com/MacHu-GWU/pygitrepo-project .

그리고 테스트 프로젝트를 만들 수 있습니다 learn_creating_py_package.

다음과 같이 다른 목적으로 사용해야 할 구성 요소를 배울 수 있습니다 .

  • virtualenv를 작성하십시오
  • 자체 설치
  • unittest를 실행
  • 코드 커버리지 실행
  • 문서 작성
  • 문서 배포
  • 다른 파이썬 버전에서 unittest를 실행하십시오.
  • PYPI에 배포

사용의 장점은 pygitrepo그 지루한가 자동으로 생성하고 적용하여된다는 점이다 package_name, project_name, github_account, document host service, windows or macos or linux.

프로처럼 파이썬 프로젝트 개발을 배우기에 좋은 곳입니다.

이것이 도움이되기를 바랍니다.

감사합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.