如何获取python解释器完整的argv命令行选项?

如何获取python解释器完整的argv命令行选项?,python,argv,werkzeug,Python,Argv,Werkzeug,我们从文件中了解到: -c 如果给定此选项,sys.argv的第一个元素将是“-c”,当前目录将添加到sys.path的开头(允许将该目录中的模块作为顶级模块导入) 如何获得完整的解释器命令行选项?我需要它来解决这个问题: 如果我启动werkzeug开发服务器,那么它将丢失fork上的-c cmd选项。我想修补werkzeug,但找不到如何获得实物期权 如果您想知道我为什么需要这个-我想在manage.py之前预先执行一些代码,这些代码需要解析sys.argv。而且我认为werkzeug方法是

我们从文件中了解到:

-c 如果给定此选项,sys.argv的第一个元素将是“-c”,当前目录将添加到sys.path的开头(允许将该目录中的模块作为顶级模块导入)

如何获得完整的解释器命令行选项?我需要它来解决这个问题:

如果我启动werkzeug开发服务器,那么它将丢失fork上的
-c cmd
选项。我想修补werkzeug,但找不到如何获得实物期权

如果您想知道我为什么需要这个-我想在manage.py之前预先执行一些代码,这些代码需要解析
sys.argv
。而且我认为werkzeug方法是不正确的,因为它在拐角处不起作用

如果我启动werkzeug开发服务器,那么它将丢失-c cmd 叉子上的选项

首先,这个过程不是简单的分叉。调用一个新的Python解释器

使用
它将丢失-c cmd
是什么意思?
cmd
字符串在argv中消失的事实?即:

$ python -c "import sys; print(sys.argv)"
['-c']
实际上,无法从
sys.argv
中访问
cmd
字符串。相关文件:

如果命令是使用-c命令行选项执行的 解释器argv[0]设置为字符串'-c'

文档不会对实际的命令字符串进行注释。虽然该命令字符串显然是作为参数“发送”给Python解释器Executable的,但CPython实现似乎没有在
sys.argv
中公开此信息。我想如果不更改
sysmodule.c
的源代码,就无法重建此信息。所以,如果你认为你依赖于解压
cmd
——你不应该!您需要找到另一种方法来注入此信息

编辑:

实际命令字符串在函数
Py\u Main()中使用。

命令是稍后在
main.c
中执行的命令

命令行参数通过PySys_SetArgv(argc-_PyOS_optind,argv+_PyOS_optind)处理
,它依次调用
sysmodule.c
中的
makeargvobject()
。后一个函数将二进制参数数据转换为类(i=0;i循环中的Python unicode对象(至少在Python 3中是这样)。因此,
argc
必须(故意)关闭-1,以便忽略所述循环中的命令

也就是说,删除命令参数的神奇之处在于设置
\u PyOS\u optind
,以便后续调用
PySys\u SetArgv(argc-\u PyOS\u optind,argv+\u PyOS\u optind)建议参数计数比实际值小(1)

我并没有真正做到这一点,但我想这几行的减少是有责任的:

if (command != NULL) {
    /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
    _PyOS_optind--;
    argv[_PyOS_optind] = L"-c";
}
Edit2:

使用当前Python 3技巧的以下补丁验证了
\u PyOS\u optin
的关键作用:

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) {
测试:


非常感谢。找不到真正条带化的
cmd
位置。在这个文件中我找到了Py_GetArgcArgv!然后我尝试了一些奇怪的工作人员,结果很奇怪:
>python-c'导入ctypes;argv=ctypes.POINTER(ctypes.c_char_p)();argc=ctypes.c_int();ctypes.pythonapi.Py_GetArgcArgv(ctypes.byref(argc),ctypes.byref(argv));打印([argv[i]表示xrange中的i(0,argc.value)])”
['python','-c','-c']
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)']