Python-如何对变量进行shell封装?

时间:2019-12-26 09:38:48

标签: python macos terminal pycharm

我需要从python运行以下shell脚本:

AliasScript = "osascript -e 'tell application \"Finder\" to make alias at \
POSIX file \"" + dirAlbumName + "\" as alias to \
POSIX file \"" + dirName + "\" as alias'"

os.system(AliasScript + "&> /dev/null")

仅在dirAlbumName和/或dirName变量不包含任何元字符(或称为特殊字符?)的情况下,例如\,{{1} }或'。例如,如果" = dirName,我会收到语法错误。

如何对这些变量进行转义?我尝试根据从here读取的内容使用shlex,但无法正常工作。例如,我尝试了/\/\/\ !@#$%^&*()|?"'"" /\?\/,但没有用。

编辑:

要清楚,此代码将在循环中用不同的shlex.quote(dirName)dirName值运行数百次,所以我不能只是手动转义它们。

3 个答案:

答案 0 :(得分:1)

您可以使用python字符串格式准确传递所需的内容,例如,您需要执行以下操作:

dirAlbumName=r"jim&bo"
dirName=r"jon smith"
AliasScriptTemplate = r"osascript -e 'tell application \"{0}\" to make alias at \
POSIX file \"{1}\" as alias to \
POSIX file \"{2}\" as alias'"
AliasScript = AliasScriptTemplate.format("Finder",dirAlbumName,dirName)
AliasScript += r'&> /dev/null'
os.system(AliasScript)

这里的关键是在字符串的前缀r意味着python不会对字符串“做任何事情”,但要保持原样。更多详情,请点击https://www.linode.com/docs/development/python/string-manipulation-python-3/

请注意,python的子进程模块非常适合运行脚本,它将使您更好地控制自己的工作,包括将stderr和stdout重定向到文件/变量/,请参见此处的说明https://www.programcreek.com/python/example/94463/subprocess.run

答案 1 :(得分:0)

请考虑使用shlex.quote模块来转义dirAlnumNamedirName。我不熟悉您使用的脚本语言,但是这就是这里发生的情况。

>>> import shlex
>>> dirname="""/\/\/\ !@#$%^&*()|?"'"" /\?\/"""
>>> print(shlex.quote(dirname))
'/\/\/\ !@#$%^&*()|?"'"'"'"" /\?\/'
>>> print (dirname)
/\/\/\ !@#$%^&*()|?"'"" /\?\/
>>>

这是一个实时示例

>>> fname = "\name"
>>> import os
>>> os.system("touch " +fname)
touch: missing file operand
Try 'touch --help' for more information.
sh: 2: ame: not found
32512
>>> import shlex
>>> os.system("touch " +shlex.quote(fname))
0

一种更安全的方法是使用subprocess模块,并完全避免使用shell。例如。

>>> import subprocess
>>> subprocess.Popen(['touch', '\name'])
>>> _.wait()
0

答案 2 :(得分:0)

我已经复制了您的问题。我创建了一个名为“ $#$%@@”的文件夹。每当其中出现“#”时,您都需要传递转义字符。 例如:

/path/to/folder/$\#$%@@