【问题标题】:I need to give variable names to subprocess.call command [duplicate]我需要为 subprocess.call 命令提供变量名称[重复]
【发布时间】:2017-12-20 12:32:49
【问题描述】:

这是我的代码:

import subprocess
subprocess.call("rm /home/winpc/Desktop/test.html", shell=True)

此代码工作正常。我需要进行以下更改。

file_name="test.html"
dir_path="/home/winpc/Desktop"

我需要使用上面提到的变量删除上面的文件 test.html。我该怎么做。

【问题讨论】:

  • 如果您使用的是subprocess.call,我建议您捕获退出代码并测试是否成功。
  • shell=True 非常危险——这意味着任何可以控制您的文件名的人都可以在您的系统上运行任意命令。

标签: python python-2.7 python-3.x


【解决方案1】:

首先,正确构造完整的文件名:

full_name = os.path.join(dir_path, file_name)

然后,将 list 作为第一个参数传递给call

subprocess.call(["rm", full_name])

(在现实生活中,你根本不会在这里使用call;你会使用os.remove(full_name)。)

【讨论】:

  • 谢谢。问题已解决。我需要按照以下方式执行复制命令
  • sourse="/home" dest="/home/test"
  • @Kit 打开一个新问题。其实不要。只需谷歌“如何复制文件”。
  • 实际上我知道该怎么做。我需要使用子进程命令来做到这一点。我需要将变量内部传递给命令。@cᴏʟᴅsᴘᴇᴇᴅ
  • @Kit 是一样的:你传递一个列表,其元素是命令的名称及其参数:subprocess.call([cmd_name, arg1, arg2])
【解决方案2】:

您可以使用字符串格式:

rm_file = "/home/winpc/Desktop/test.html"
subprocess.call("rm {}".format(rm_file), shell=True)

顺便说一句,我建议尽可能不要使用shell=True;而是将参数作为列表传递:

rm_file = "/home/winpc/Desktop/test.html"
subprocess.call(["rm", rm_file])

【讨论】:

  • 这不仅仅是一个建议,而且对安全性至关重要——我建议将正确/安全/首选的公式 first 放在答案中,以使其更加突出。如果用户有一个名为/home/winpc/Desktop/$(rm -rf ~).html...
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 2020-12-07
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多