在Python中读取包含特殊字符的参数时出现问题
我有一个脚本(a.py),它需要输入两个参数,像这样:
#!/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.
有没有什么解决办法呢?
3 个回答
/swdev/tools/python/current/linux64/bin/python: 没有找到匹配项。
我觉得问题可能是你的Python环境没有设置好:
你机器上Python能正常运行吗?
这个错误是来自你的命令行环境,而不是Python。你在你的.bashrc
文件里有没有设置过shopt -s failglob
这个选项?
问题出在你使用的命令上,这些命令和你展示给我们的不一样。证据是,在Perl中,前两个命令行参数是 $ARGV[0]
和 $ARGV[1]
(命令名是 $0
)。你给我们的Perl脚本不会产生你展示的输出。
“没有匹配”是一个shell错误信息。
请复制粘贴(不要重新输入)你Python脚本的确切内容,确切的命令行,以及你得到的确切输出。
还有一些需要注意的地方:
你是用 a.py
来调用脚本,这意味着你要么把它复制到了你的 $PATH
中的某个目录,要么 .
在你的 $PATH
中。如果是后者,那就不太安全;想想如果你 cd
进入一个包含一个(可能是恶意的)命令叫 ls
的目录会发生什么。把 .
放在你的 $PATH
的末尾比放在开头安全,但我还是建议完全不放,使用 ./command
来调用当前目录下的命令。无论如何,为了这个练习,请使用 ./a.py
而不是 a.py
,这样我们可以确保你不是在其他地方的 $PATH
中找到了另一个 a.py
。
这可能不太可能,但检查一下你当前目录下是否有文件名中包含 *
字符的文件。如果有文件名是字面意思的 "asd*123"
,那么 some_command 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是否在调用你的脚本。