当前位置: 首页 > 面试题库 >

如何逃避os.system()调用?

萧德庸
2023-03-14
问题内容

使用os.system()时,通常必须转义文件名和其他作为参数传递给命令的参数。我怎样才能做到这一点?最好是可以在多个操作系统/外壳上运行的东西,尤其是bash。

我目前正在执行以下操作,但是请确保为此必须有一个库函数,或者至少是一个更优雅/更强大/更有效的选项:

def sh_escape(s):
   return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")

os.system("cat %s | grep something | sort > %s" 
          % (sh_escape(in_filename), 
             sh_escape(out_filename)))

编辑: 我已经接受了使用引号的简单答案,不知道为什么我没有想到;我猜是因为我来自Windows,其中“和”的行为略有不同。

关于安全性,我理解这个问题,但是在这种情况下,我对os.system()提供的一种快速简便的解决方案感兴趣,并且字符串的来源不是用户生成的,或者至少是由受信任的用户(我)。


问题答案:

这是我用的:

def shellquote(s):
    return "'" + s.replace("'", "'\\''") + "'"

外壳程序将始终接受带引号的文件名,并在将其传递给所涉及的程序之前删除其引号。值得注意的是,这避免了文件名包含空格或任何其他讨厌的shell元字符的问题。

更新 :如果您使用的是Python
3.3或更高版本,请使用shlex.quote而不是自己滚动。



 类似资料:
  • 问题内容: MySQL要求对带有阴影的保留字的表进行打勾。我有一个表Role(表角色),它是一个保留字,但是我已经将查询放在后面的刻度中,因此我可以在多行中写它(这是一个玩具查询,大的查询不能放在一行中)。 我如何摆脱背tick? 这是我的代码: 问题答案: 您不能在反引号内转义反引号,但是您可以执行以下操作:

  • 描述 (Description) 它动态构建选择器,并使用属性或变量值作为任意字符串。 例子 (Example) 以下示例演示了在LESS文件中使用转义 - <html> <head> <title>Less Escaping</title> <link rel = "stylesheet" type = "text/css" href = "style.css" /

  • 问题内容: 如果我将代码文件另存为,则没有控制台窗口出现-这是我想要的- 但是如果代码包含对的调用,我仍然会得到一个讨厌的控制台窗口。我认为是由调用引起的。有没有一种方法可以从我的脚本中执行其他文件而根本不提高控制台窗口? 问题答案: 如果要避免启动控制台窗口,可以尝试将subprocess模块(,或其他)与参数一起使用。

  • 问题内容: 在python类中,@property是一个很好的装饰器,避免使用显式的setter和getter函数。但是,它的开销是“经典”类函数的2到5倍。就我而言,在设置属性的情况下这是完全可以的,与设置时需要进行的处理相比,开销微不足道。 但是,获取属性时不需要任何处理。它始终只是“返回自我属性”。是否有一种优雅的方法来使用setter而不使用getter而不需要使用其他内部变量? 只是为了

  • 我们有一个正在工作的gcloud deploy命令,我们正在尝试添加一个新的环境变量。当前的工作示例如下所示: 现在,我们要添加的env变量是一个简单的列表,例如:MY_LIST=['val1','val2'],所以首先我们尝试了显而易见的: 但立即得到了错误: (gcloud.functions.deploy)无法识别的参数:val2] 因此,我们开始研究如何转义本文中指出的值 根据这篇文章,我

  • 问题内容: 我正在使用以下代码通过AJAX提交表单: 背景 我的PHP处理程序执行各种任务,然后发回响应。然后,我可以在成功或错误函数中执行某些操作。 我的问题 当用户双击表单的“提交”按钮时,将发生两次AJAX调用,这将导致我的PHP处理程序中的代码执行两次。 我的问题 如果用户双击提交,如何避免我的代码执行两次? 问题答案: 当AJAX调用再次出现时,请先禁用首次单击的“提交”按钮,然后重新启