annotate Python/frozenmain.c @ 73323:dad02a080bbc

Improve byte-compilation in packaging to be independent of -O or -B. The code I fixed to comply with PEP 3147 still had one bug: When run under python -O, some paths for pyc files would be pyo, because I called imp.cache_from_source without explicit debug_override argument in some places, and under -O that would return .pyo (this is well explained in the imp docs). Now all code (util.byte_compile, build_py, install_lib) can create .pyo files according to options given by users, without interference from the calling Python’s own optimize mode. On a related topic, I also removed the code that prevented byte compilation under python -B. The rationale is that packaging gives control over the creation of pyc files to the user with its own explicit option, and the behavior should not be changed if the calling Python happens to run with -B for whatever reason. I will argue that this is a bug fix and ask to be allowed to backport this change to distutils. Finally, I moved one nugget of information about the --compile and --optimize options from the source into the doc. It clears up a misunderstanding that I (and maybe other people) had.
author Éric Araujo <merwok@netwok.org>
date Thu, 03 Nov 2011 05:08:28 +0100
parents cab14be0ada1
children ab8121466785
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Python interpreter main program for frozen scripts */
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
2624
6341a4c0082b renaming phase 3
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
4 #include "Python.h"
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 24071
diff changeset
5 #include <locale.h>
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
7 #ifdef MS_WINDOWS
13663
29da35543833 ANSIfy as many declarations as possible.
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
8 extern void PyWinFreeze_ExeInit(void);
29da35543833 ANSIfy as many declarations as possible.
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
9 extern void PyWinFreeze_ExeTerm(void);
29da35543833 ANSIfy as many declarations as possible.
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
10 extern int PyInitFrozenExtensions(void);
7846
6c6a48bc5817 Make calls into ../PC/frozen_dllmain.c on MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 7210
diff changeset
11 #endif
6c6a48bc5817 Make calls into ../PC/frozen_dllmain.c on MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 7210
diff changeset
12
2892
33b154b6c61b moved stuff around to resemble main.c
Guido van Rossum <guido@python.org>
parents: 2624
diff changeset
13 /* Main program */
33b154b6c61b moved stuff around to resemble main.c
Guido van Rossum <guido@python.org>
parents: 2624
diff changeset
14
33b154b6c61b moved stuff around to resemble main.c
Guido van Rossum <guido@python.org>
parents: 2624
diff changeset
15 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
16 Py_FrozenMain(int argc, char **argv)
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
18 char *p;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
19 int i, n, sts;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
20 int inspect = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
21 int unbuffered = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
22 char *oldloc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
23 wchar_t **argv_copy = PyMem_Malloc(sizeof(wchar_t*)*argc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
24 /* We need a second copies, as Python might modify the first one. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
25 wchar_t **argv_copy2 = PyMem_Malloc(sizeof(wchar_t*)*argc);
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1396
diff changeset
26
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
27 Py_FrozenFlag = 1; /* Suppress errors from getpath.c */
7210
bccdeca81669 Set Py_FrozenFlag, to suppress error messages from getpath.c.
Guido van Rossum <guido@python.org>
parents: 7116
diff changeset
28
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
29 if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
30 inspect = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
31 if ((p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
32 unbuffered = 1;
1318
92e6a8cf14be * pythonmain.c: -k option, usage message, more environment flags.
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
33
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
34 if (unbuffered) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
35 setbuf(stdin, (char *)NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
36 setbuf(stdout, (char *)NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
37 setbuf(stderr, (char *)NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
38 }
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1396
diff changeset
39
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
40 if (!argv_copy) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
41 fprintf(stderr, "out of memory\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
42 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
43 }
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 24071
diff changeset
44
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
45 oldloc = setlocale(LC_ALL, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
46 setlocale(LC_ALL, "");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
47 for (i = 0; i < argc; i++) {
48987
f83dccf417f0 Issue #3696: Error parsing arguments on OpenBSD <= 4.4 and Cygwin.
Antoine Pitrou <solipsis@pitrou.net>
parents: 46318
diff changeset
48 #ifdef HAVE_BROKEN_MBSTOWCS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
49 size_t argsize = strlen(argv[i]);
48987
f83dccf417f0 Issue #3696: Error parsing arguments on OpenBSD <= 4.4 and Cygwin.
Antoine Pitrou <solipsis@pitrou.net>
parents: 46318
diff changeset
50 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
51 size_t argsize = mbstowcs(NULL, argv[i], 0);
48987
f83dccf417f0 Issue #3696: Error parsing arguments on OpenBSD <= 4.4 and Cygwin.
Antoine Pitrou <solipsis@pitrou.net>
parents: 46318
diff changeset
52 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
53 size_t count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
54 if (argsize == (size_t)-1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
55 fprintf(stderr, "Could not convert argument %d to string\n", i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
56 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
57 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
58 argv_copy[i] = PyMem_Malloc((argsize+1)*sizeof(wchar_t));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
59 argv_copy2[i] = argv_copy[i];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
60 if (!argv_copy[i]) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
61 fprintf(stderr, "out of memory\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
62 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
63 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
64 count = mbstowcs(argv_copy[i], argv[i], argsize+1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
65 if (count == (size_t)-1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
66 fprintf(stderr, "Could not convert argument %d to string\n", i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
67 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
68 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
69 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
70 setlocale(LC_ALL, oldloc);
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 24071
diff changeset
71
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
72 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
73 PyInitFrozenExtensions();
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
74 #endif /* MS_WINDOWS */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
75 Py_SetProgramName(argv_copy[0]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
76 Py_Initialize();
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
77 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
78 PyWinFreeze_ExeInit();
7846
6c6a48bc5817 Make calls into ../PC/frozen_dllmain.c on MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 7210
diff changeset
79 #endif
5852
4a4778e61c14 Tracking changes to Py_Main():
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
80
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
81 if (Py_VerboseFlag)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
82 fprintf(stderr, "Python %s\n%s\n",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
83 Py_GetVersion(), Py_GetCopyright());
5852
4a4778e61c14 Tracking changes to Py_Main():
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
84
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
85 PySys_SetArgv(argc, argv_copy);
1318
92e6a8cf14be * pythonmain.c: -k option, usage message, more environment flags.
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
86
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
87 n = PyImport_ImportFrozenModule("__main__");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
88 if (n == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
89 Py_FatalError("__main__ not frozen");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
90 if (n < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
91 PyErr_Print();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
92 sts = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
93 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
94 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
95 sts = 0;
1318
92e6a8cf14be * pythonmain.c: -k option, usage message, more environment flags.
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
96
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
97 if (inspect && isatty((int)fileno(stdin)))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
98 sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
1318
92e6a8cf14be * pythonmain.c: -k option, usage message, more environment flags.
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
99
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
100 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
101 PyWinFreeze_ExeTerm();
7846
6c6a48bc5817 Make calls into ../PC/frozen_dllmain.c on MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 7210
diff changeset
102 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
103 Py_Finalize();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
104 for (i = 0; i < argc; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
105 PyMem_Free(argv_copy2[i]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
106 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
107 PyMem_Free(argv_copy);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
108 PyMem_Free(argv_copy2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
109 return sts;
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 }