윈도우 파이썬 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. Do **not** build Python into your .exe file directly.  On Windows,
   Python must be a DLL to handle importing modules that are
   themselves DLL's.  (This is the first key undocumented fact.)
   Instead, link to "python*NN*.dll"; it is typically installed in
   "C:\Windows\System".  *NN* is the Python version, a number such as
   "33" for Python 3.3.

   두 가지 방법으로 파이썬에 링크할 수 있습니다. 로드 타임 링크는
   "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. If you use SWIG, it is easy to create a Python "extension module"
   that will make the app's data and methods available to Python.
   SWIG will handle just about all the grungy details for you.  The
   result is C code that you link *into* your .exe file (!)  You do
   **not** have to create a DLL file, and this also simplifies
   linking.

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 이외의 컴파일러를
   사용하면 명백해집니다.

   Problem 1: The so-called "Very High Level" functions that take
   "FILE *" arguments will not work in a multi-compiler environment
   because each compiler's notion of a "struct FILE" will be
   different.  From an implementation standpoint these are very low
   level functions.

   문제 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()" 를 정의합니다.


How do I solve the missing api-ms-win-crt-runtime-l1-1-0.dll error?
===================================================================

This can occur on Python 3.5 and later when using Windows 8.1 or
earlier without all updates having been installed. First ensure your
operating system is supported and is up to date, and if that does not
resolve the issue, visit the Microsoft support page for guidance on
manually installing the C Runtime update.
