파이썬 조직 공학 디렉토리
파이썬 조직 공학 디렉토리
좋은 파이썬 프로젝트 디렉토리 구조를 구성하는 방법에 대한 몇 가지 합의가 디렉토리 구조되었습니다 이미 있습니다. 의 유래에서 이 문제 에 대한, 우리는 파이썬 디렉토리 구조에 대한 설명을 볼 수 있습니다.
즉 말했다, 아주 좋은되고있다, 나는 바퀴가 서로 다른 다양한 방법을 인용 다시 작성하지 않으려는, 거기 나는 나의 이해와 경험을했다.
프로젝트를 가정하면 foo는 이름,이 같은 가장 편리한 디렉토리 구조가 충분 비교하는 것이 좋습니다 :
Foo/
|-- bin/
| |-- foo
|
|-- foo/
| |-- tests/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py
|
|-- docs/
| |-- conf.py
| |-- abc.rst
|
|-- setup.py
|-- requirements.txt
|-- README
간단히 설명합니다 :
bin/
: 물론라는 이름의 실행 파일에 저장된 일부 항목은, 당신은 할 수 있습니다script/
또한 같은 라인.foo/
모든 프로젝트의 소스 코드를 저장합니다. (1) 모든 소스 코드 모듈, 패키지는이 디렉토리에 배치해야합니다. 최상위 디렉토리를 넣지 마십시오. (2) 그 서브tests/
저장 부 테스트 코드는, 입구 (3) 프로그램 바람직라는main.py
.docs/
: 일부 문서를 저장합니다.setup.py
: 설치, 배포가, 스크립트 패키지.requirements.txt
: 외부 소프트웨어 종속성의 파이썬 패키지 저장소 목록을 표시합니다.README
: 프로젝트 문서.
또한, 프로그램의 수는 점점 더 많은 콘텐츠를 제공하는있다. 예를 들어 LICENSE.txt
, ChangeLog.txt
이러한 일들이 필요 사용하는 주로 오픈 소스 프로젝트이기 때문에 등 파일, 나는 여기에 나열하지 않았습니다. 당신이 오픈 소스 소프트웨어를 작성하려면, 디렉토리를 구성하는 방법, 당신은 참조 할 수 있습니다 이 문서 .
여기에서, 단순히 내이 디렉토리의 이해와 개인의 요구에 대해 이야기한다.
README 소개
나는이 각 프로젝트 파일을 가져야한다고 생각, 목적은 독자들이 신속하게 프로젝트를 이해 할 수 있도록 프로젝트 설명의 정보를 브리핑 할 수있을 것입니다.
그것은 다음과 같은 문제에 주목해야한다 :
- 소프트웨어 현지화, 소프트웨어의 기본 기능.
- 코드 실행 방법 : 설치 환경은 명령을 시작합니다.
- 사용에 대한 간략한 설명입니다.
- 코드 디렉토리 구조는 더 자세한 설명은 소프트웨어의 기본 원칙을 가리킬 수 있습니다.
- 자주 묻는 질문 (FAQ).
나는 좋은 몇 가지 추가보다 있다고 생각합니다 README
. 소프트웨어 개발의 초기에, 때문에 개발 과정은 초기에 보완 될 것입니다 분명 이상 변경 될 수 있습니다, 반드시 모든 정보에 없습니다. 그러나 프로젝트의 끝에서, 같은 문서를 작성할 필요가있다.
요구 사항에 대한
파이썬 프로젝트는 종속성 및 정확한 버전 번호를 저장하는 데 사용되는 requirements.txt 파일을 포함해야합니다. 새로운 환경을 구축하기 위해.
공식 문서 :
핍의 문서 상태
핍 설명
요구 사항 형식으로 출력 설치 패키지를 동결.
목록 목록 패키지를 설치했습니다.
(이이 문서를 업데이트하는 것이 가장 좋습니다 그렇지 않으면 설치 후, 로컬 데이터 패키지를 많이 생성하거나 패키지를 업그레이드합니다) 가상 환경에서 핍 세대를 사용 :
주사위 동결> 지역 환경 패키지 requirements.txt # 출력 파일
가상 환경의 전체 복사본을 생성해야하는 경우, 당신은 새로운 가상 환경을 만들고 그에서 다음 명령을 실행할 수 있습니다 :
대한 -r requirements.txt 번호를 패키지 설치 파일을 설치 PIP
Requirements.txt 수요 파일 내용의 예 :
증류기의 == 0.8.6
표백제 == 1.4.3
== 6.6을 클릭
지배 == 2.2.1
setup.py 소개
일반적으로 사용하는 setup.py
코드, 설치 및 배포 문제를 관리하기 위해 포장. 업계 표준은 파이썬 인기 포장 도구로 작성 setuptools에 이 일을 관리 할 수 있습니다. 이 모드는 일반적으로 오픈 소스 프로젝트를 사용한다. 그러나 여기 이러한 문제를 해결하기 위해 표준화 된 도구를 사용하지 않을의 핵심 아이디어는하지만 프로젝트가, 설치하는 배포 도구가 있어야합니다 빠르고 쉽게, 코드가 배포되고 실행됩니다 환경에 새 컴퓨터에 설치 될 수 있다고 말했다 최대.
나는이 구덩이 밟았다.
내가 처음 파이썬 쓰기 프로젝트, 설치 환경, 코드를 배포하는 전체 프로세스가 수동으로 수행되는 프로그램을 실행과 접촉 왔을 때, 나는 다음과 같은 문제가 발생했습니다 :
- 설치 환경은 종종 잊지 때 최근에 새로운 파이썬 패키지 라인에 대한 실행 결과, 잘못된 프로그램을 추가합니다.
- 파이썬 패키지 의존성 문제의 버전, 때때로 우리는 프로그램에서 사용 파이썬 패키지의 버전이지만, 공식 수동으로 잘못 될 수있다 설치하여 설치 최신 패키지를 가지고있다.
- 당신은 많은 패키지에 의존하는 경우, 하나 하나가,이 것은 매우 시간이 많이 걸리는 설치를 따라 달라집니다.
- 신입생은 종종 다양한 종속성을 설치하는 방법을 잊을 수 있기 때문에, 프로그램이 될 것까지 매우 귀찮은 실행 프로젝트를 쓰기 시작했다.
setup.py
이러한 것들은 함께 자동화 할 수 있습니다, 효율성을 개선하고 오류의 가능성을 줄일 수 있습니다. "일을 자동화 할 수있는 자동화 된 복잡한 일들이. 자동화해야한다"매우 좋은 습관입니다.
setuptools에 문서 의 경우 새로운 상대적으로 큰을, 당신은 좋은 진입 점을 찾을 수 없습니다. 기술 방법을 배우는 것은 다른 사람, 당신은 플라스크가 작성된 어떻게 파이썬 웹 프레임 워크를 참조 할 수 있습니다 사용하는 방식을 볼 수 있습니다 : setup.py
물론, 간단한 포인트는 자신의 설치 스크립트 (쓰기 deploy.sh
) 대안 setup.py
도 나쁜 생각이 아니다.
conf.py 소개
위의 디렉토리 구조에, 거기에 더 의지 없음을 참고 conf.py
소스 디렉토리에 있지만,에 docs/
디렉토리.
구성 파일은 많은 프로젝트는 방법을 사용합니다 :
- 프로파일 파이썬 이러한 여기 conf.py. 하나 개 이상의 파일을 작성
- 관통 직접 구성 파일을 사용하는 모듈 프로젝트
import conf
코드 형식이 구성의 사용.
나는이 방법에 동의하지 않는다 :
- 이것은 단위 테스트가 곤란하게 (인해 내부 모듈은 외부 구성 종속성)
- 제어 프로그램의 사용자 인터페이스와 같은 반면 프로필, 파일 경로는 사용자가 임의로 지정한다.
- 이러한 모듈은 대부분 의존하도록 모든 코드 모듈을 하드 코딩을 통해 나쁜 재사용 프로그램 구성 요소,
conf.py
이 파일.
그래서, 구성 및 더 나은 방법을 사용하여 생각,
- 구성 모듈은 외부 프로파일에 의해 영향을받지 않는 유연한 구성된다.
- 구성 프로그램은 또한 유연하게 제어된다.
아이디어는 증거로 할 수있다, 이러한 프로그램을 자유롭게 지정된 사용자 구성 할 수 있습니다 MySQL은,,의 nginx를 사용 nginx를 mysql을 학생들이 알고있다.
따라서, 코드는 직접적으로 안 import conf
프로파일을 사용 하였다. 디렉토리 구조 위의 conf.py
샘플 구성은, 주어진 직접 프로그램에서 참조 구성 파일을 하드 코딩하지. 당신이 줄 수있는 main.py
프로그램이 지정된 구성 경로 구성 시작 매개 변수 방법의 내용을 읽을 수 있도록. 물론 여기서 conf.py
당신은 예를 들어, 비슷한 이름을 변경할 수 있습니다 settings.py
. 또는 당신은 이러한 구성 파일을 작성하는 다른 형식의 콘텐츠를 사용할 수있는 settings.yaml
등.
main.py 소개
__name__ == '__main__'
파이썬은입니다 main函数
입구. 하지가 사용하는 문구를 추가하는 말을 python xxx.py
현재 직접 직접 파이썬을 실행이라고 여부를 판단 할 수있는 곳을 수행 할 수 있지만.
getopt
읽기위한 포장 방법 main函数
매개 변수 나중에 따릅니다. getopt.getopt(args, options[, long_options])
이 세 가지 변수는 인수가 있습니다입니다 python xxx.py
일반적으로 매개 변수를 뒤 따르 sys.argv
배열,하지만 때문에 우리는 일반적으로 첫 번째 요소를 제거 할 sys.argv
첫 번째 요소는 文件名
그 자체. 따라서, 우리의 표현이다 sys.argv[1:]
.
options
매개 변수를 해결해야하는 설명하는 문자열입니다. 파라미터는 다음과 같은 변수로하지 않는 경우에는 -h
변수 이름의 직접적인 용도. 당신이 통과해야하는 경우 매개 변수의 변수는 증가 뒤에 :
예를 들어, n:
. 그래서이 사건의 hn:w:
의미, 우리가 즉 세 개의 매개 변수를 가지고 -h
, -n
, -w
어떤 -h
변수를 전달하지만, 할 필요가 없습니다 -n
, -w
변수를 전달해야합니다.
long_options
매개 변수 말했다 구문 분석 할 필요가 문자열의 배열입니다. long_options
친척 options
, 우리가 리눅스에서 용어, 우리는 종종 명령의 매개 변수는 쓰기의 다양한 있습니다 참조 가장 일반적인 두 개의 기록을 보유하고, 매개 변수를 수 있도록하는 것입니다 -h
, --help
. 전자는 우리가 무엇을 options
, 후자는 동안, long_options
.
우리가있는 경우 --help
, 다음 long_options
은입니다 ['help']
. 당신이 필요로하는 매개 변수가 매개 변수를 전달하는 경우, 예를 들어 --name 'Good'
, 다음 long_options
점에서 ['name=']
, 그래, 그 하나입니다 =
.
getopt.getopt
튜플 (OPTS, 인수), 반환 opts
우리는 매개 변수를 구문 분석 것입니다,하지만 args
그것은 나머지 매개 변수를 확인할 수 없습니다. opts
그것은 튜플 각 튜플 배열되는 키 값에 대응한다. key
우리의 매개 변수 이름이며, value
컨텐츠 매개 변수입니다.
클래식 예 :
# 코딩 = UTF-8
수입 getopt는
수입 SYS
__name__ == '__main__'의 경우 :
OPTS, 인수 = getopt.getopt (sys.argv에 [1], 'HN : w'[ '이름 =' '= 단어', '도움말'])
= '어떤 이름을'이름없는
단어 = '안녕하세요'
키, OPTS 가치 :
만약 키 [ '-h'--help '] :
인쇄 '인간 안녕에 프로그램'
인쇄 '매개 변수'
print'-H \ T는 도움말을 표시합니다 '
print'-N의 \의 t 당신의 이름 '
print'-w의 \의 t는 '하고 싶은 말
sys.exit (0)
만약 키 [-N ''--name '] :
이름 = 값
만약 키 [ '-w'--word '] :
워드 = 값
, ',', 단어를 이름을 '안녕하세요, 제 이름을'인쇄
클래스 클래스 호출 우선 순위 :
1 def__new __ (CLS)
2, def__init의 __ (자기) :
3 def__call의 __ (자체, X) :