파이썬에서 사소하지 않은 최종 사용자 데스크탑 (웹이 아닌) 응용 프로그램을 개발하려고한다고 상상해보십시오. 프로젝트의 폴더 계층을 구성하는 가장 좋은 방법은 무엇입니까?
바람직한 기능은 유지 관리 용이성, IDE 친 화성, 소스 제어 분기 / 병합에 대한 적합성 및 쉬운 설치 패키지 생성입니다.
특히:
- 소스를 어디에 두나요?
- 응용 프로그램 시작 스크립트는 어디에 배치합니까?
- IDE 프로젝트를 어디에 배치합니까?
- 단위 / 수락 테스트는 어디에 배치합니까?
- 구성 파일과 같은 비 Python 데이터를 어디에 두나요?
- pyd / so 이진 확장 모듈에 C ++과 같은 비 Python 소스를 어디에 배치합니까?
답변
너무 중요하지 않습니다. 당신을 행복하게하는 것은 효과가있을 것입니다. 파이썬 프로젝트는 단순 할 수 있기 때문에 많은 어리석은 규칙은 없습니다.
/scripts
또는/bin
이런 종류의 명령 줄 인터페이스에/tests
당신의 테스트를 위해/lib
C 언어 라이브러리/doc
대부분의 문서/apidoc
Epydoc에서 생성 한 API 문서
그리고 최상위 디렉토리에는 README, Config 및 기타가 포함될 수 있습니다.
어려운 선택은 /src
나무 를 사용할지 여부 입니다. 파이썬은 구별이없는 /src
, /lib
그리고 /bin
Java 또는 C와 같은있다.
최상위 /src
디렉토리는 의미없는 것으로 간주 되므로 최상위 디렉토리는 응용 프로그램의 최상위 아키텍처가 될 수 있습니다.
/foo
/bar
/baz
이 모든 것을 “name-of-my-product”디렉토리에 두는 것이 좋습니다. 따라서라는 애플리케이션을 작성하는 quux
경우이 모든 것을 포함하는 디렉토리의 이름은 /quux
입니다.
다른 프로젝트 는 모듈 재사용을 PYTHONPATH
포함 /path/to/quux/foo
할 수 있습니다 QUUX.foo
.
필자의 경우 Komodo Edit를 사용하기 때문에 IDE cuft는 단일 .KPF 파일입니다. 실제로 최상위 /quux
디렉토리에 넣고 SVN에 추가하는 것을 생략합니다.
답변
Jean-Paul Calderone의 Python 프로젝트 의 파일 시스템 구조에 따르면 :
Project/
|-- bin/
| |-- project
|
|-- project/
| |-- test/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py
|
|-- setup.py
|-- README
답변
Jean-Paul Calderone 의이 블로그 게시물 은 일반적으로 Freenode의 #python에서 답변으로 제공됩니다.
파이썬 프로젝트의 파일 시스템 구조
하다:
- 프로젝트와 관련된 디렉토리 이름을 지정하십시오. 예를 들어, 프로젝트 이름이 “Twisted”인 경우 소스 파일의 최상위 디렉토리 이름을 지정하십시오
Twisted
. 릴리스를 수행 할 때 버전 번호 접미 부를 포함시켜야합니다Twisted-2.5
.- 디렉토리를 만들고
Twisted/bin
실행 파일이 있으면 거기에 넣으십시오..py
파이썬 소스 파일 인 경우에도 확장명을 주지 마십시오 . 프로젝트의 다른 곳에 정의 된 주 함수를 가져오고 호출하는 것을 제외하고는 코드를 넣지 마십시오. (약간 주름 : Windows에서는 파일 확장자로 인터프리터가 선택되므로 Windows 사용자는 실제로 .py 확장자를 원합니다. 따라서 Windows 용 패키지를 추가 할 때 추가 할 수 있습니다. 불행히도 쉽게 혼란스러운 트릭은 없습니다 POSIX에서 .py 확장자는 유일한 경고이지만 Windows에서는 실제 버그가 아니라고 생각합니다. 사용자 데이터베이스에 Windows 사용자가 포함되어 있으면 .py 만 선택할 수 있습니다. 사방 확장.)- 프로젝트가 단일 Python 소스 파일로 표현 가능한 경우 디렉토리에 넣고 프로젝트와 관련된 이름을 지정하십시오. 예를 들면 다음과 같습니다
Twisted/twisted.py
. 여러 소스 파일이 필요한 경우 대신 패키지를 만들고 (Twisted/twisted/
비어있는Twisted/twisted/__init__.py
) 소스 파일을 그 안에 넣으십시오. 예를 들면 다음과 같습니다Twisted/twisted/internet.py
.- 단위 테스트를 패키지의 하위 패키지에 넣으십시오 (이것은 위의 단일 Python 소스 파일 옵션이 트릭임을 의미합니다- 단위 테스트에는 항상 하나 이상의 다른 파일이 필요합니다). 예를 들면 다음과 같습니다
Twisted/twisted/test/
. 물론로 패키지를 만드십시오Twisted/twisted/test/__init__.py
. 와 같은 파일에 테스트를 배치하십시오Twisted/twisted/test/test_internet.py
.- 기분이 좋으면 소프트웨어를 각각 추가
Twisted/README
하고Twisted/setup.py
설명하고 설치하십시오.하지 마십시오 :
src
또는 라는 디렉토리에 소스를 넣으십시오lib
. 설치하지 않고 실행하기가 어렵습니다.- 테스트를 파이썬 패키지 외부에 두십시오. 이로 인해 설치된 버전에 대해 테스트를 실행하기가 어렵습니다.
- 패키지 작성 에만 A가 들어를
__init__.py
에 모든 코드를 넣어 다음과__init__.py
. 패키지 대신 모듈을 만들면 더 간단합니다.- 파이썬이 모듈이나 패키지를 포함하는 디렉토리를 가져 오기 경로에 추가하지 않고도 (PYTHONPATH 또는 다른 메커니즘을 통해) 파이썬이 모듈이나 패키지를 가져올 수 있도록 마법의 해킹을 생각해보십시오. 당신은 할 수 없습니다 올바르게 모든 경우를 처리하고 소프트웨어가 자신의 환경에서 작동하지 않는 경우 사용자는 화가 얻을 것이다.
답변
올바른 방법으로 Python 프로젝트 오픈 소싱을 확인하십시오 .
이 훌륭한 기사 의 프로젝트 레이아웃 부분을 발췌하겠습니다 .
프로젝트를 설정할 때, 레이아웃 (또는 디렉토리 구조)이 올바르게 작동하는 것이 중요합니다. 합리적인 레이아웃은 잠재적 인 기여자가 코드를 찾기 위해 영원히 사냥 할 필요가 없다는 것을 의미합니다. 파일 위치는 직관적입니다. 우리는 기존 프로젝트를 다루고 있기 때문에 아마도 무언가를 움직여야 할 것입니다.
맨 위에서 시작합시다. 대부분의 프로젝트에는 setup.py, README.md, requirements.txt 등과 같은 여러 최상위 파일이 있습니다. 모든 프로젝트에는 세 개의 디렉토리가 있어야합니다.
- 프로젝트 문서를 포함하는 문서 디렉토리
- 실제 Python 패키지를 저장하는 프로젝트 이름으로 명명 된 디렉토리
- 두 곳 중 하나의 테스트 디렉토리
- 테스트 코드 및 리소스가 포함 된 패키지 디렉토리 아래
- 독립형 최상위 디렉토리로서 파일을 구성하는 방법을 더 잘 이해하기 위해 다음은 프로젝트 중 하나 인 sandman의 레이아웃에 대한 간략한 스냅 샷입니다.
$ pwd
~/code/sandman
$ tree
.
|- LICENSE
|- README.md
|- TODO.md
|- docs
| |-- conf.py
| |-- generated
| |-- index.rst
| |-- installation.rst
| |-- modules.rst
| |-- quickstart.rst
| |-- sandman.rst
|- requirements.txt
|- sandman
| |-- __init__.py
| |-- exception.py
| |-- model.py
| |-- sandman.py
| |-- test
| |-- models.py
| |-- test_sandman.py
|- setup.py
보시다시피, 최상위 파일, docs 디렉토리 (스핑크스가 생성 된 문서를 저장하는 빈 디렉토리 임), sandman 디렉토리 및 sandman 아래의 test 디렉토리가 있습니다.
답변
“Python Packaging Authority”에는 샘플 프로젝트가 있습니다.
https://github.com/pypa/sampleproject
Python Packaging 사용자 안내서의 프로젝트 패키징 및 배포에 대한 자습서를 돕기 위해 존재하는 샘플 프로젝트입니다.
답변
python_boilerplate 템플릿을 사용하여 프로젝트를 시작하십시오 . 이 방법은 모범 사례 (예 : 여기 )를 따르지만 어느 시점에서 프로젝트를 하나 이상의 계란으로 나눌 의사가있는 경우에 더 적합합니다 (그리고 가장 간단한 프로젝트를 제외하고는 무엇이든 믿습니다). 일반적인 상황은 다른 사람의 라이브러리를 로컬에서 수정 한 버전을 사용해야하는 경우입니다).
-
소스를 어디에 두나요?
- 상당히 큰 프로젝트의 경우 소스를 여러 개의 계란으로 나누는 것이 좋습니다. 각 계란은에서 별도의 setuptools-layout으로 이동
PROJECT_ROOT/src/<egg_name>
합니다.
- 상당히 큰 프로젝트의 경우 소스를 여러 개의 계란으로 나누는 것이 좋습니다. 각 계란은에서 별도의 setuptools-layout으로 이동
-
응용 프로그램 시작 스크립트는 어디에 배치합니까?
- 이상적인 옵션은 응용 프로그램 시작 스크립트를
entry_point
에그 중 하나로 등록하는 것입니다.
- 이상적인 옵션은 응용 프로그램 시작 스크립트를
-
IDE 프로젝트를 어디에 배치합니까?
- IDE에 따라 다릅니다. 많은 사람들이
PROJECT_ROOT/.<something>
프로젝트의 루트에 물건을 보관하고 있습니다.
- IDE에 따라 다릅니다. 많은 사람들이
-
단위 / 수락 테스트는 어디에 배치합니까?
- 각 계란에는 별도의 테스트 세트가 있으며
PROJECT_ROOT/src/<egg_name>/tests
디렉토리에 보관됩니다 . 개인적으로 사용하는 것을 선호py.test
합니다.
- 각 계란에는 별도의 테스트 세트가 있으며
-
구성 파일과 같은 비 Python 데이터를 어디에 두나요?
- 때에 따라 다르지. 비 파이썬 데이터에는 여러 유형이있을 수 있습니다.
- “자원” , 즉 계란 안에 포장해야하는 데이터. 이 데이터는 패키지 네임 스페이스 내의 해당 에그 디렉토리로 이동합니다. 에서
pkg_resources
패키지를 통해setuptools
또는importlib.resources
표준 라이브러리 의 모듈을 통해 Python 3.7부터 사용할 수 있습니다 . - “Config-files” , 즉 프로젝트 소스 파일 외부에있는 것으로 간주되지만 응용 프로그램이 실행될 때 일부 값으로 초기화되어야하는 비 Python 파일. 개발하는 동안 나는 그런 파일들을에 보관하는 것을 선호합니다
PROJECT_ROOT/config
. 배포를 위해 다양한 옵션이있을 수 있습니다. Windows에서는%APP_DATA%/<app-name>/config
, Linux/etc/<app-name>
또는을 사용할 수 있습니다/opt/<app-name>/config
. - 생성 된 파일 , 즉 실행 중에 응용 프로그램에서 만들거나 수정할 수있는 파일.
PROJECT_ROOT/var
개발 중에 그리고/var
Linux 배포 중에 유지하는 것을 선호 합니다.
- “자원” , 즉 계란 안에 포장해야하는 데이터. 이 데이터는 패키지 네임 스페이스 내의 해당 에그 디렉토리로 이동합니다. 에서
- 때에 따라 다르지. 비 파이썬 데이터에는 여러 유형이있을 수 있습니다.
- pyd / so 이진 확장 모듈에 C ++과 같은 비 Python 소스를 어디에 배치합니까?
- 으로
PROJECT_ROOT/src/<egg_name>/native
- 으로
문서는 일반적으로 PROJECT_ROOT/doc
또는 그 안에 들어갑니다 PROJECT_ROOT/src/<egg_name>/doc
(일부 계란을 별도의 큰 프로젝트로 간주하는지 여부에 따라 다릅니다). 일부 추가 구성은 PROJECT_ROOT/buildout.cfg
and와 같은 파일에 있습니다 PROJECT_ROOT/setup.cfg
.
답변
내 경험상, 그것은 단지 반복의 문제입니다. 어디를 가든 데이터와 코드를 배치하십시오. 어쨌든 당신은 틀릴 것입니다. 그러나 상황이 어떻게 형성 될지에 대한 더 나은 아이디어를 얻으면 이러한 종류의 추측을 할 수있는 훨씬 더 나은 위치에있게됩니다.
확장 소스에 관해서는, 파이썬 용 디렉토리와 다양한 다른 언어 용 디렉토리를 포함하는 트렁크 아래에 Code 디렉토리가 있습니다. 개인적으로, 나는 다음에 확장 코드를 자체 리포지토리에 넣는 경향이 있습니다.
그 말로, 나는 나의 초기 지점으로 돌아갑니다. 너무 큰 거래를하지 마십시오. 당신을 위해 일하는 것 같아요. 작동하지 않는 것을 찾으면 변경할 수 있습니다.