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

2023-12-22

我们从文档中得知:

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

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

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

如果我启动werkzeug开发服务器,那么它就会丢失-c cmd叉子上的选项。我想修补 werkzeug,但找不到如何获得实际选项。

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


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

首先,进程并不是简单的分叉。调用新的 Python 解释器。

你是什​​么意思it will lost -c cmd?事实是cmdargv 中的字符串消失了?那是:

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

确实,cmd无法从内部访问字符串sys.argv. This https://docs.python.org/2/library/sys.html#sys.argv是相关文档:

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

该文档没有评论实际的命令字符串。虽然该命令字符串显然是作为参数“发送”给 Python 解释器可执行文件的,但 CPython 实现似乎并未在其中公开此信息sys.argv。我想在不改变源代码的情况下无法重建这些信息sysmodule.c。所以,如果你认为你依赖于提取cmd——你不应该!您需要找到另一种方法来注入此信息。

Edit:

实际的命令字符串消耗在Modules/main.c https://github.com/python/cpython/blob/master/Modules/main.c在功能上Py_Main():

wcscpy(command, _PyOS_optarg);

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

命令行参数通过以下方式处理PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);,这又调用makeargvobject() in 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";
}

Edit2:

验证了关键作用_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) {

Test:

 $ ./python -c "import sys; print(sys.argv)"
['./python', '-c', 'import sys; print(sys.argv)']
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何在 Django/Python 中自动填充 PDF 表单? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有 PDF 表单 我想使用 Django Web 应用程序中的数据自动填充这些表单 然后提供给用户下载
  • config 文件夹中的 main.php 和 main-local.php 之间的区别?

    谁能解释一下两者之间的区别main php and main local php在配置文件夹中 为什么一个人拥有 local 而另一个则没有 你可以阅读配置和环境 https github com yiisoft yii2 app adva
  • Aspectj 覆盖方法的参数

    我正在开发一个方面 用于检查 setter 方法的参数并用 null 值覆盖空字符串 这是我到目前为止的状态 Before execution de foo entity set args java lang String public v
  • 在 VBA 中使用 .NET HashTable 返回类型

    我在 VB NET 中创建了一个 NET 库 并且有一个函数返回一个对象HashTable 我一直在寻找如何在 Excel VBA 中访问 HashTable 对象中的元素 但找不到解决方案 我是 VBA 新手 请原谅我 我已经寻找过 但找
  • Rails 5 Carrierwave 没有与图像匹配的路线

    我需要一些帮助 我正在使用 Rails 5 和 Carrierwave 上传图像 我遇到的问题是图像已保存但不会显示 我得到一个没有路由匹配的 GET 我将图像存储在 Rails root 的上传文件夹中 因为我不希望它们保存在公共环境中目
  • python pandas dataframe按日期条件切片

    我可以使用 python datetime 对象读取和切片 pandas 数据帧 但是我被迫只使用现有日期在索引中 例如 这有效 gt gt gt data
  • Android SQLITE非法状态异常[重复]

    这个问题在这里已经有答案了 我使用以下代码将项目添加到数据库 public static void insertQuestion Context c JSONArray jarr String search throws JSONExcep
  • 通过随机点绘制好看的贝塞尔曲线

    我使用 javascript 和 RaphaelJS 来通过随机点绘制一条平滑的线 并输出到 SVG 该线严格水平移动 不会沿 X 轴返回 目前 我正在使用三次贝塞尔曲线来绘制从一点到另一点的线 问题是 这条线看起来不够好 两条曲线在一个点
  • 在 Android Studio 3.2 中看不到 find-sample-code 选项

    In 文档 https developer android com studio write sample code inline他们讲述查找代码示例选项 导入示例 但我在 Android Studio 3 2 中看不到它们 在代码中 突出
  • 如何计算 QueryDSL 中结果组的数量?

    如何在 QueryDSL Java 中 中实现组计数 背景 我正在表上实现分页搜索 我想在返回结果之前对结果进行分组 除了平常的LIMIT x OFFSET y查询时 我还想接收总行数 这是一页的 简化的 SQL 查询 SELECT x y
  • const char[] 和 const char* 之间的区别

    So 本文 https glandium org blog p 2361正在讨论声明字符串文字的用法 例如const char foo foo 它以以下声明结束 const char foo foo 几乎从来都不是你想要的 相反 您想使用以
  • 如何使用 A-Star 或 Dijkstra 算法解决 15 个难题?

    我在一本人工智能书籍中读到 用于模拟或游戏中寻路的流行算法 A Star Dijkstra 也被用来解决著名的 15 谜题 谁能给我一些关于如何将 15 个拼图简化为节点和边图的指示 以便我可以应用其中一种算法 如果我将图中的每个节点视为游
  • 在 Reporting Services 2008 中显示时间

    我的报告中有一个表 其中有数据类型的列Time 7 现在我在 Reporting Services 2008 中正确格式化它们时遇到问题 如果我将表达式的格式设置为 HH mm 它仍然显示11 12 000 我只想得到小时和分钟 喜欢11
  • 选择一个工具来创建/维护自定义 Eclipse 发行版

    我想选择一个工具来创建 维护我的自定义 eclipse distrib 从下一个 3 6 开始 通过研究之前的问题 主要竞争者似乎是 Pulse http www poweredbypulse com Yoxos http ondemand
  • 在python中获取类和实例的属性

    在 python 中工作下一个代码 class MyClass object field 1 gt gt gt MyClass field 1 gt gt gt MyClass field 1 当我想要自定义字段的返回值时 我使用下一个代码
  • 当我使用 angularJS ng-repeat 时,它不显示我在 javascript 中附加的内容

    在 HTML 中 我想显示多行项目 任务时间线 在每一行中 gantt items gantt days 用于绘制 365 个小框 并呈现 一年 365 天 并且每一行需要显示一个蓝色块 表示该任务的分配时间段 timeline item
  • SignalR 2.X.X 的 Context.User.Identity.Name 为 null。如何修复它?

    这让我发疯 我正在使用最新的 signalR 版本 2 0 2 这是我的集线器代码 OnConnected public override Task OnConnected User is null then Identity and Na
  • C++ 将 ostream 作为参数传递

    我正在为一个虚拟名片盒做一个家庭作业项目 它需要一个主类 一个名片盒类和一个卡片类 为了将所有 卡片 的内容输出到控制台 赋值表示 main 应该调用 rolodex 类中的 show 函数 向其传递一个 ostream 和 show 然后
  • 如何让 VB6 与 Visual Source Safe 6.0 集成?

    我们在工作中使用 Visual Source Safe 6 0 VB6 应该能够与 Source Safe 顺利集成 这两个应用程序都安装在我的 PC 上 但 VB6 没有显示与 Source Safe 集成的选项 例如 签出文件 查看文件
  • 如何获取 python 解释器完整的 argv 命令行选项?

    我们从文档中得知 C 如果给出此选项 sys argv 的第一个元素将为 c 并且当前目录将添加到 sys path 的开头 允许该目录中的模块作为顶级模块导入 如何获得完整的解释器命令行选项 我需要它来解决这个问题 https githu