在Python中读取包含特殊字符的参数时出现问题

2 投票
3 回答
4072 浏览
提问于 2025-04-17 00:11

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

0

/swdev/tools/python/current/linux64/bin/python: 没有找到匹配项。

我觉得问题可能是你的Python环境没有设置好:

你机器上Python能正常运行吗?

0

这个错误是来自你的命令行环境,而不是Python。你在你的.bashrc文件里有没有设置过shopt -s failglob这个选项?

1

问题出在你使用的命令上,这些命令和你展示给我们的不一样。证据是,在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是否在调用你的脚本。

撰写回答