【问题标题】:Passing arguments to a python program将参数传递给 python 程序
【发布时间】:2018-04-14 01:23:46
【问题描述】:

我有一个接收文件路径作为参数的 python 程序。

问题是,如果文件路径有以下字符:“%cd”,那么它会将“%cd”替换为当前目录。

例如:

python program.py  "C:\%af%32%cd%7f.htm"

sys.argv(在 program.py 中)显示:

['program.py', 'C:\\%af%32C:\\%7f.htm']

为什么会发生这种情况以及如何解决?

编辑

问题是,如果我将“%cd”放在命令行中,那么在 python 中,我会得到带有当前目录字符串而不是“%cd”字符的命令行

【问题讨论】:

  • 这不是 python 问题,而是 Windows CMD 问题。 Windows CMD 在将 %cd% 传递给 python 之前替换它。
  • @Ben Maybe.. 同时我没有发现 "%cd" 在 windows CMD 中有效.. 但我发现 "%cd" 是 ipython 中的一个特殊命令
  • 在类 Unix 系统上,您可以通过用单引号(而不是双引号)引用 arg 来停止类似的参数扩展。这在 Windows 上不起作用吗?
  • 在命令行中使用 %% 见stackoverflow.com/questions/2058944/…
  • @MartinBeckett 在每个“%”字符之前添加另一个 % 无效:(

标签: python windows shell command-line-arguments argv


【解决方案1】:

使用 %% 转义 % 仅适用于批处理文件,不适用于命令行。 可以用双引号转义 %

例如: python untitled0.py "C:\\"%"af"%"32"%"cd"%"7f.htm"

['untitled0.py', 'C:\"%af%32%cd%7f.htm']

但这有点乏味 - 你必须小心 \ 转义任何 "

另一种选择是将 % 替换为其他符号,然后在 python 程序中将其更改回?

【讨论】:

  • 您忘记从输出中删除双引号。
  • 请注意,在命令行上处理引号是一个由两部分组成的过程。首先,引用会阻止 CMD 解释特殊字符(例如“&”),但 CMD 会完全按照所写的方式在命令行上传递引号。由子进程来删除它们,这通常是通过 C 运行时,它将命令行解析到 argv 列表中。 CommandLineToArgvW 遵循类似的规则。
  • @eryksun 看起来 python 解释器剥离了它们。那是 python 中 print(sys.argv) 的输出
  • 是的,Python 从 C 运行时获得 argv,但我想在这里为 Unix 用户澄清 ​​shell 的作用,他们可能假设 shell 处理删除引号并创建 argv 数组. Windows 程序得到一个命令行字符串,如何解析它取决于每个程序。
猜你喜欢
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多