繁体   English   中英

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

[英]How to get python interpreter full argv command line options?

我们从文档中知道:

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

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

https://github.com/mitsuhiko/werkzeug/blob/f50bdc04cf1c8d71d12d13a0c8ef2878477f4d24/werkzeug/_reloader.py#L141

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

如果您想知道为什么我需要这样做-我想在manage.py之前预解析一些要解析sys.argv代码。 而且我认为werkzeug方法是不正确的,因为它在极端情况下不起作用。

如果启动werkzeug开发服务器,那么它将在fork上丢失-c cmd选项。

首先,该过程并非简单地分叉。 一个新的Python解释器被调用。

it will lost -c cmd是什么意思? cmd字符串在argv中消失了吗? 那是:

$ python -c "import sys; print(sys.argv)"
['-c']

实际上,无法从sys.argv内部访问cmd字符串。 是相关文档:

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

该文档不评论实际的命令字符串。 尽管该命令字符串已明确地“发送”为python解释器可执行文件的参数,但CPython实现似乎并未在sys.argv公开此信息。 我想如果不更改sysmodule.c的源代码就无法重建此信息。 因此,如果您认为自己依赖于提取cmd ,则不应该这样做! 您需要找到另一种方式来注入此信息。

编辑:

实际的命令字符串在Py_Main()函数的Modules/main.c中使用:

wcscpy(command, _PyOS_optarg);

command是稍后在main.c执行的command

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

也就是说,删除命令参数的_PyOS_optind在于设置_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";
}

EDIT2:

在以下Python 3技巧补丁中验证了_PyOS_optind的关键作用:

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)']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM