如何获取python解释器完整的argv命令行选项?
我们从文件中了解到: -c 如果给定此选项,sys.argv的第一个元素将是“-c”,当前目录将添加到sys.path的开头(允许将该目录中的模块作为顶级模块导入) 如何获得完整的解释器命令行选项?我需要它来解决这个问题: 如果我启动werkzeug开发服务器,那么它将丢失fork上的如何获取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 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;iargc
必须(故意)关闭-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)']