【问题标题】:Problem with reading in parameters with special characters in Python在 Python 中读取带有特殊字符的参数的问题
【发布时间】:2011-11-01 21:36:21
【问题描述】:

我有一个脚本 (a.py) 读取 2 个参数,如下所示:-

#!/usr/bin/env python

import sys
username = sys.argv[1]
password = sys.argv[2]

问题是,当我用一些特殊字符调用脚本时:-

a.py   "Lionel"   "my*password"

它给了我这个错误:-

/swdev/tools/python/current/linux64/bin/python: No match.

有什么解决方法吗?

更新- 有人怀疑这可能是外壳问题而不是脚本问题。 我也是这么想的,直到我在 perl 脚本(a.pl)上尝试了它,它完美地运行没有任何问题:-

#!/usr/bin/env perl
$username = $ARGV[1];
$password = $ARGV[2];
print "$username $password\n";

%a.pl  "lionel"  "asd*123"
==> lionel   asd*123

没问题。

所以我想,这在我看来更像是一个 PYTHON 问题。

天哪……..

【问题讨论】:

  • 引号应该阻止 shell 尝试将 *. a.py的shebang行是什么样子的,python实际上是安装在/swdev/tools/python/current/linux64/bin/python吗?
  • 我也无法重现,你确定阅读sys.argv时出现错误?
  • 由于 shell 命令可能会被记录并可供机器上的所有用户查看,因此输入密码作为命令行参数不是一个好主意。
  • 绝对与 python 无关,因为 python 错误永远不会像那样。 shebang (#!...) 可能是问题所在。
  • 编辑了问题,加入了 shebang 行。是的。 python肯定安装在/swdev/tools/python/current/linux64/bin/python

标签: python perl shell parameter-passing csh


【解决方案1】:

该错误来自您的 shell,而不是 Python。您的.bashrc 或其他地方是否设置了shopt -s failglob

【讨论】:

  • 我查过了,我的 .cshrc* 或 .bashrc 中也没有找到这些语句。
  • 顺便说一句,我根本无法在我的系统上重现这个。适用于特殊字符。
  • 我猜应该是 c-shell,因为我只能在本地找到 .cshrd*。
  • 试试这个:输入bash -i,得到一个新的提示,然后尝试运行脚本。
  • @lionel319 让我们continue this discussion in chat
【解决方案2】:

问题在于您实际使用的命令与您向我们展示的命令不同。证据:在 Perl 中,前两个命令行参数是$ARGV[0]$ARGV[1](命令名称是$0)。您向我们展示的 Perl 脚本不会产生您向我们展示的输出。

“不匹配”是一个 shell 错误消息。

复制并粘贴(不要重新键入)Python 脚本的 exact 内容、用于调用它的 exact 命令行以及准确你得到的输出。

还有一些需要注意的事项:

您正在以a.py 的身份调用脚本,这意味着您正在将其复制到$PATH 中的某个目录,或者. 在您的$PATH 中。如果是后者,那是个坏主意;考虑一下如果你cd 信息包含一个名为ls 的(可能是恶意的)命令的目录会发生什么。将. 放在$PATH 的末尾比放在开头更安全,但我仍然建议完全不使用它并使用./command 调用当前目录中的命令。在任何情况下,出于本练习的目的,请使用./a.py 而不是a.py,这样我们就可以确保您不会从$PATH 的其他地方获取另一个a.py

这是一个长镜头,但请检查当前目录中是否有任何文件名称中包含 * 字符。如果没有匹配的文件,some_command asd*123(不带引号)将失败,但如果恰好有一个文件名的字面意思是 "asd*123",则不会。

要尝试的另一件事:按如下方式更改您的 Python 脚本:

#!/usr/bin/env python

print "before import sys"

import sys

print "after import sys"

username = sys.argv[1]
password = sys.argv[2]

这将告诉您 shell 是否正在调用您的脚本。

【讨论】:

  • @lionel319:我看到你已经接受了我的回答,但我还是不知道问题出在哪里。你能详细说明一下吗?
【解决方案3】:

/swdev/tools/python/current/linux64/bin/python:不匹配。

我认为问题在于没有设置python env:

python 能在你的机器上运行吗?

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多