Ако стартирам сървър за разработка на werkzeug, той ще загуби опцията -c cmd при разклонението.
Първо, процесът не е просто раздвоен. Извиква се нов интерпретатор на Python.
Какво имаш предвид с it will lost -c cmd
? Фактът, че низът cmd
го няма в argv? Това е:
$ python -c "import sys; print(sys.argv)"
['-c']
Наистина низът cmd
не е достъпен от sys.argv
. Това е свързана документация:
Ако командата е била изпълнена с помощта на опцията на командния ред -c към интерпретатора, argv[0] е зададен на низа '-c'
Документите не коментират действителния команден низ. Въпреки че този команден низ е ясно "изпратен" като аргумент към изпълнимия файл на интерпретатора на Python, реализацията на CPython изглежда не излага тази информация в рамките на sys.argv
. Предполагам, че няма начин да се реконструира тази информация, без да се промени изходният код на sysmodule.c
. Така че, ако мислите, че зависи от извличането на cmd
-- не трябва! Трябва да намерите друг начин да инжектирате тази информация.
Редактиране:
Действителният команден низ се консумира в Modules/main.c
във функция Py_Main()
:
wcscpy(command, _PyOS_optarg);
Това command
е това, което се изпълнява по-късно в main.c
.
Аргументите на командния ред се обработват чрез PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
, което на свой ред извиква makeargvobject()
в sysmodule.c
. Последната функция преобразува данните от двоичния аргумент в Python unicode обекти (поне в Python 3 го прави) в for (i = 0; i < argc; i++) {}
-подобен цикъл. И така, argc
трябва (умишлено) да бъде изключено с -1, за да игнорира командата в споменатия цикъл.
Това означава, че магията на премахването на аргумента на командата е в настройката _PyOS_optind
, така че последващото извикване на PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
предполага брой аргументи, по-малък (с 1), отколкото е в действителност.
Не проследих наистина, но предполагам, че намаляването в тези редове е отговорно:
if (command != NULL) {
/* Backup _PyOS_optind and force sys.argv[0] = '-c' */
_PyOS_optind--;
argv[_PyOS_optind] = L"-c";
}
Редактиране 2:
Потвърдихте решаващата роля на _PyOS_optind
тук със следната корекция към текущия съвет на Python 3:
diff --git a/Modules/main.c b/Modules/main.c
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -679,9 +679,11 @@
}
if (command != NULL) {
/* Backup _PyOS_optind and force sys.argv[0] = '-c' */
_PyOS_optind--;
- argv[_PyOS_optind] = L"-c";
+ _PyOS_optind = 0;
+ //argv[_PyOS_optind] = L"-c";
}
if (module != NULL) {
Тест:
$ ./python -c "import sys; print(sys.argv)"
['./python', '-c', 'import sys; print(sys.argv)']
person
Dr. Jan-Philip Gehrcke
schedule
09.02.2015