使用Python中的特殊字符读取参数时出现问题

时间:2011-08-23 11:51:19

标签: python perl shell parameter-passing csh

我有一个脚本(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.

对此有何解决方法?

更新 - 人们怀疑这可能是一个shell问题,而不是脚本问题。 我也这么认为,直到我在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问题。

Geezzz ........

3 个答案:

答案 0 :(得分:1)

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

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

复制并粘贴(不要重新输入)Python脚本的完全内容,用于调用它的完全命令行,以及确切的输出。

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

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

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

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

"asd*123"

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

答案 1 :(得分:0)

该错误来自您的shell,而不是来自Python。您在shopt -s failglob或某个地方设置了.bashrc吗?

答案 2 :(得分:0)

  

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

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

你的机器上是否运行python?