윈도우 파이썬 FAQ
*****************


윈도우에서 파이썬 프로그램을 실행하려면 어떻게 해야 합니까?
===========================================================

이 질문은 명확한 질문이 아닙니다. 이미 윈도우 명령 줄에서 프로그램을
실행하는 것에 익숙 하다면 이 모든 것이 분명할 것입니다. 그렇지 않으면,
좀 더 지침이 필요할 수 있습니다.

Unless you use some sort of integrated development environment, you
will end up *typing* Windows commands into what is referred to as a
"Command prompt window".  Usually you can create such a window from
your search bar by searching for "cmd".  You should be able to
recognize when you have started such a window because you will see a
Windows "command prompt", which usually looks like this:

   C:\>

아마 글자가 다르고, 그 뒤에 다른 것들이 있을 수 있습니다. 그러므로 다
음과 같은 것을 쉽게 볼 수 있습니다:

   D:\YourName\Projects\Python>

컴퓨터 설정 방법과 최근에 끝낸 그 밖의 것에 의존적입니다. 일단 이런 창
을 시작했다면, 파이썬 프로그램을 실행할 준비가 된 것입니다.

파이썬 스크립트는 파이썬 *인터프리터* 라는 다른 프로그램에서 진행할 필
요가 있다는 것을 알고 있어야 합니다. 인터프리터는 스크립트를 읽고, 바
이트 코드로 컴파일하고, 바이트 코드를 실행하여 프로그램을 구동합니다.
그렇다면, 인터프리터를 통해 파이썬을 처리하려면 어떻게 준비해야 하겠습
니까?

먼저, 명령 창이 "py"라는 단어를 해석기를 시작하는 지시로 인식하는지 확
인해야합니다. 명령 창을 열고 있으면, 명령 "py" 를 입력하고 return 키를
눌러야 합니다:

   C:\Users\YourName> py

다음과 같이 표시됩니다:

   Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
   Type "help", "copyright", "credits" or "license" for more information.
   >>>

인터프리터를 "대화형 모드"로 시작했습니다. 즉, 파이썬 문장이나 표현식
을 대화식으로 입력하여 대기하는 중에 실행 혹은 평가시킬 수 있습니다.
이것은 파이썬의 가장 강력한 기능 중 하나입니다. 선택한 몇 가지 수식을
입력하여 확인하고 그 결과를 확인하십시오:

   >>> print("Hello")
   Hello
   >>> "Hello" * 3
   'HelloHelloHello'

많은 사람이 대화형 모드를 편리하면서도 프로그래밍이 가능한 계산기로 사
용합니다. 대화형 파이썬 세션을 종료하려면, "exit()" 함수를 호출하거나
"Z" 를 입력하면서 "Ctrl" 키를 누르고 나서 ""Enter"" 키를 눌러 윈도우
명령 프롬프트로 돌아갑니다.

또한, 시작 ‣ 프로그램 ‣ Python 3.x ‣ Python(명령 줄) 메뉴 선택과 같은
시작 메뉴 항목을 찾아볼 수 있으며, 그 결과 새 창에서 ">>>" 프롬프트를
볼 수 있습니다. 이 경우, "exit()" 함수를 호출하거나 "Ctrl-Z" 를 입력하
면 창이 사라집니다. 윈도우에서 단일 "python" 명령을 실행하는 중이고,
인터프리터를 종료하면 창을 닫습니다.

이제 "py" 명령이 인식되었으므로, 당신은 당신의 파이썬 스크립트를 줄 수
있습니다. 파이썬 스크립트에 절대 경로나 상대 경로를 지정해야 할 것입니
다. 당신의 파이썬 스크립트가 "hello.py" 라는 이름으로 당신의 데스크톱
에 위치한다고 하면, 명령 프롬프트가 홈 디렉토리에 잘 열려있으므로 다음
과 같이 내용이 표시됩니다:

   C:\Users\YourName>

그래서 이제 스크립트 경로 뒤에 "py" 를 입력하여 파이썬 스크립트를 제공
하기 위해 "py" 명령을 요청할 것입니다:

   C:\Users\YourName> py Desktop\hello.py
   hello


파이썬 스크립트 실행 파일로 만들려면 어떻게 해야 합니까?
========================================================

윈도우에서 표준 파이썬 설치관리자는 이미 .py 확장자와 파일 유형
(Python.File)을 연결했고, 인터프리터("D:\Program
Files\Python\python.exe "%1" %*")를 실행하는 open 명령의 파일 유형을
제공합니다. 이것은 명령 프롬프트에서 'foo.py' 과 같은 스크립트 실행파
일을 만들기에 충분합니다. 확장자명 없이 'foo' 를 입력하여 스크립트를
실행하려면 PATHEXT 환경 변수에 .py를 추가해야 합니다.


왜 때때로 파이썬은 시작하는 데 시간이 오래 걸립니까?
====================================================

일반적으로 파이썬은 윈도우에서 매우 빠르게 시작되지만, 때때로 파이썬을
시작하는 데 갑자기 오랜 시간이 걸린다는 버그 보고서가 있습니다. 이러한
것은 파이썬이 동일하게 구성된 것으로 보이는 다른 윈도우 시스템에서 잘
작동하기 때문에 더욱 더 곤혹스럽게 만듭니다.

이 문제는 해당 컴퓨터의 바이러스 검사 소프트웨어의 잘못된 설정으로 발
생하는 것일 수 있습니다. 일부 바이러스 스캐너는 파일 시스템으로부터 읽
은 모든 것을 모니터링하도록 스캐너를 구성할 때 두 자릿수 규모의 시동
오버헤드를 도입하는 것으로 알려져 있습니다. 시스템에서 바이러스 검사
소프트웨어의 구성을 확인하여 실제로 동일하게 구성되었는지 확인하십시오
. 모든 파일 시스템 읽기 작업을 검색하도록 구성된 경우, McAfee는 특히
문제를 일으킵니다.


파이썬 스크립트에서 실행 파일을 만드는 방법은 무엇입니까?
=========================================================

See 파이썬 스크립트로 독립 실행형 바이너리를 만들려면 어떻게 해야 합니
까? for a list of tools that can be used to make executables.


"*.pyd" 파일은 DLL과 동일합니까?
================================

예, .pyd 파일은 dll 이지만, 몇 가지 차이점이 있습니다. 만약 당신이
"foo.pyd" 라는 이름의 DLL을 가지고 있다면, "PyInit_foo()" 함수를 반드
시 가지고 있어야 합니다. 당신은 파이썬 "import foo"를 쓸 수 있으며, 파
이썬은 (foo.py, foo.pyc 뿐만 아니라) foo.pyd 를 검색할 것이고, 이를 발
견하면 초기화하기 위해 "PyInit_foo()" 호출을 시도할 것입니다. 윈도우에
서 DLL 의 존재를 요구할 것이기 때문에 .exe를 foo.lib와 링크하면 안 됩
니다.

foo.pyd에 대한 검색 경로는 윈도우에서 foo.dll을 검색하는 데 사용하는
경로가 아닌 PYTHONPATH임을 유의하십시오. 또한, 프로그램을 실행하기 위
해 foo.pyd가 있을 필요는 없지만, 프로그램을 dll과 링크한 경우에는 dll
이 필요합니다. 물론, "import foo" 를 하기 위해서는 foo.pyd가 필요합니
다. DLL에서 링키지는 소스 코드에서 "__declspec(dllexport)" 로 선언됩니
다. .pyd에서 링키지는 사용 가능한 함수 목록에 정의됩니다.


윈도우 응용프로그램에 파이썬을 포함하려면 어떻게 해야 합니까?
=============================================================

윈도우 앱에서 파이썬 인터프리터를 포함하려면 다음과 같이 요약할 수 있
습니다:

1. .exe 파일에 직접 파이썬을 빌드하면 안 됩니다. 윈도우에서 파이썬은
   그 자신이 DLL인 모듈의 임포트를 처리하기 위해서는 DLL이어야 합니다.
   (이것이 문서화되지 않은 첫 번째 사실입니다) 대신에,
   "python*NN*.dll" 에 링크하면 됩니다. 일반적으로 "C:\Windows\System"
   에 설치됩니다. *NN*은 파이썬 버전이고, Python 3.3의 경우 "33"과 같
   은 숫자입니다.

   두 가지 방법으로 파이썬에 링크할 수 있습니다. 로드 타임 링크는
   "python*NN*.lib" 에 대한 링크를 의미하고, 런타임 링크는
   "python*NN*.dll" 에 대한 링크를 의미합니다. (일반 참고:
   "python*NN*.lib" 는 "python*NN*.dll" 에 해당하는 소위 "import lib"
   입니다. 오직 링커를 위해 기호만 정의합니다)

   런타임 링크는 링크 옵션을 크게 단순화합니다. 모든 것은 런타임 중에
   발생합니다. 당신의 코드는 윈도우 "LoadLibraryEx()" 루틴을 사용하여
   "python*NN*.dll" 을 로드해야 합니다. 그 코드는 윈도우
   "GetProcAddress()" 루틴에서 얻은 포인터를 사용하여 "python*NN*.dll"
   (파이썬의 C API)의 엑세스 루틴 및 데이터를 사용해야 합니다. 매크로
   는 이러한 포인터를 파이썬 C API에서 루틴을 호출하는 모든 C 코드에
   투명하게 사용할 수 있습니다.

2. SWIG를 사용할 경우, 앱의 데이터와 메서드를 파이썬에서 사용할 수 있
   게 만드는 파이썬 "확장 모듈"을 생성하는 것이 쉽습니다. SWIG는 당신
   을 위해 모든 성가신 세부사항들을 처리할 것입니다. 그 결과로 .exe 파
   일에 링크한 C 코드가 생성됩니다! DLL 파일을 만들 필요가 없으며, 만
   들지 않으면 링크하는 것도 간단해집니다.

3. SWIG는 확장 모듈의 이름에 따라 이름이 달라지는 초기화 함수(C 함수)
   를 생성합니다. 예를 들어, 모듈의 이름이 leo인 경우, 초기화 함수를
   initleo()로 합니다. SWIG 섀도 클래스를 사용하면 initleoc()로 합니다
   . 이것은 섀도 클래스가 사용하는 대부분 숨겨진 조력자 클래스를 초기
   화합니다.

   2단계에서 C 코드를 .exe 파일에 링크할 수 있는 이유는 초기화 함수를
   호출하는 것이 모듈을 파이썬으로 임포트하는 것과 동일하기 때문입니다
   ! (이것이 문서화되지 않은 두 번째 사실입니다)

4. 간단히 말해서, 당신은 당신의 확장 모듈로 파이썬 인터프리터를 초기화
   하기 위해 다음 코드를 사용할 수 있습니다.

      #include "python.h"
      ...
      Py_Initialize();  // Initialize Python.
      initmyAppc();  // Initialize (import) the helper class.
      PyRun_SimpleString("import myApp");  // Import the shadow class.

5. 파이썬의 C API에는 두 가지 문제가 있는데, 이것은 당신이
   PythonNN.dll을 만드는 데 사용되는 컴파일러인 MSVC 이외의 컴파일러를
   사용하면 명백해집니다.

   문제 1: FILE * 인자를 취하는 소위 "매우 높은 수준"의 함수는 각 컴파
   일러의 구조체 FILE 개념이 다르기 때문에 멀티 컴파일러 환경에서는 작
   동하지 않습니다. 구현 관점에서 볼 때 이들은 매우 낮은 수준의 함수입
   니다.

   문제 2: 반환값이 void인 C 함수의 래퍼를 생성할 때 SWIG는 다음과 같
   은 코드를 생성합니다:

      Py_INCREF(Py_None);
      _resultobj = Py_None;
      return _resultobj;

   아아, Py_None은 pythonNN.dll 내부의 _Py_NoneStruct라는 복잡한 데이
   터 구조에 대한 참조로 확장하는 매크로입니다. 다시 말하자면, 이 코드
   는 멀티 컴파일러 환경에서 실패할 것입니다. 다음과 같은 코드로 바꾸
   십시오:

      return Py_BuildValue("");

   저는 이것을 작동시키지는 못했지만, SWIG의 "%typemap" 명령을 사용하
   여 자동으로 변경하는 것이 가능할지도 모릅니다(저는 완전 SWIG 초보자
   입니다).

6. 윈도우 앱 내부에서 파이썬 셸 스크립트를 사용하여 파이썬 인터프리터
   창을 설치하는 것은 좋은 생각이 아닙니다. 결과 창은 앱의 창 시스템과
   는 독립적일 것입니다. 오히려, 당신(또는 wxPythonWindow 클래스)은
   "native" 인터프리터 창을 만들어야 합니다. 이 창은 파이썬 인터프리터
   와 연결하기 쉽습니다. 당신은 파이썬의 i/o를 읽기 및 쓰기를 지원하는
   모든 객체로 리디렉션할 수 있으므로 read() 와 write() 메서드를 포함
   하는 파이썬 객체(확장 모듈에 정의됨)만 있으면 됩니다.


편집기가 내 파이썬 소스에 탭을 삽입하지 않도록 하려면 어떻게 해야 합니까?
=========================================================================

FAQ는 탭을 사용하는 것을 권장하지 않으며, 파이썬 스타일 안내서( **PEP
8** )는 분산된 파이썬 코드에 대해 4 개의 스페이스를 권장합니다. 이 또
한 Emacs python-mode의 기본값입니다.

모든 편집기에서 탭과 스페이스를 혼용하는 것은 좋은 생각이 아닙니다. 이
점에서 MSVC는 다르지 않으며 스페이스를 사용하기 쉽게 구성됩니다: 다음
행동을 따라 해보십시오 Tools ‣ Options ‣ Tabs, 그리고 파일 유형은
""Default"로 하고 "Tab size"와 "Indent size"는 4로 설정하고, "Insert
spaces"를 라디오 버튼으로 선택합니다.

만일 혼용된 탭과 스페이스로 인해 선행 공백에 문제가 발생하는 경우, 파
이썬이 "IndentationError" 나 "TabError" 를 발생시킵니다. 또한,
"tabnanny" 모듈을 실행하여 배치 모드에서 디렉터리 트리를 확인할 수도
있습니다.


블로킹 없이 키 입력을 확인하려면 어떻게 해야 합니까?
====================================================

"msvcrt" 모듈을 사용합니다. 이것은 표준 윈도우-특정 확장 모듈입니다.
이것은 키보드 히트가 존재하는지를 확인하는 "kbhit()" 와 에코 없이 문자
를 얻는 "getch()" 를 정의합니다.
