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

Python子进程Grep

姬寂离
2023-03-14
问题内容

我正在尝试使用subprocess模块​​在python脚本中使用grep命令。

这是我所拥有的:

userid = 'foo12'
p = subprocess.Popen(['grep', "%s *.log"%userid], stdout=subprocess.PIPE)

它什么也不返回。我不完全确定自己在做什么错,所以有人可以解释一下。我正在使用的当前方法有效,方法是添加shell =
true,使其输出正确的输出,但是正如帮助页面所指出的那样,这是不安全的。我需要帮助以使此工作正常进行,以便我的脚本不是不安全的。


问题答案:

我认为您遇到了两个问题:

  1. 这个电话:
    p = subprocess.Popen(['grep', "%s *.log"%userid]...
    

除非shell=True将参数列表直接传递给os.execvp,否则它将无法按预期工作,这要求每个项目都是代表参数的单个字符串。您已经将
两个单独的参数 压缩到一个字符串中(换句话说,grep将“ foo12 *.log”解释为要搜索的 模式 ,而不是模式+文件列表)。

您可以通过以下方式解决此问题:

    p = subprocess.Popen(['grep', userid, '*.log']...)
  1. 第二个问题是,再次没有shell=Trueexecvp*.log将不知道您的意思并将其直接传递给grep,而无需通过外壳的通配符扩展机制。如果您不想使用shell=True,则可以执行以下操作:
    import glob
    

    args = [‘grep’, userid]
    args.extend(glob.glob(‘*.log’)
    p = subprocess.Popen(args, …)



 类似资料:
  • 问题内容: 是否有任何参数或选项可为Python的subprocess.Popen方法设置超时? 像这样: ? 问题答案: 我会建议采取看看类中的模块。我用它来实现超时。 首先,创建一个回调: 然后打开过程: 然后创建一个计时器,该计时器将调用回调,并将过程传递给它。 在程序后面的某个位置,您可能需要添加以下行: 否则,python程序将继续运行,直到计时器运行完毕。 编辑:我被告知, 在和条件之

  • 问题内容: 有没有办法在python中“持久”进行子过程调用?我正在调用一个程序,该程序需要一段时间才能加载多次。因此,如果我不关闭程序就可以保持打开状态并与之通信,那将是很好的。 我的python脚本的卡通版本如下所示: 我需要分别处理每个文本,因此将它们全部合并到一个大文本文件中并进行一次处理不是一种选择。 最好,如果有这样的选择 我可以让流程保持开放状态,对此我将非常感激。 问题答案: 您可

  • 问题内容: 我尝试完成的任务是流式处理ruby文件并打印输出。(注意:我不想一次打印出所有内容) main.py puts “hello” 问题 流文件工作正常。打招呼/再见输出将延迟2秒打印。就像脚本应该工作一样。问题是readline()最终挂起并且永不退出。我从来没有达到最后的打印。 我知道这里有很多类似的问题,但是这些都不是让我解决问题的方法。我并不是整个子流程中的人,所以请给我一个更实际

  • 问题内容: 我想同时运行许多进程并能够随时输出stdout。我该怎么办?我需要为每个调用运行线程吗? 问题答案: 您可以在一个线程中完成。 假设您有一个脚本可以随机打印行: 而且您想在输出可用后立即收集它,您可以按照@zigg的建议在POSIX系统上 使用: 更具可移植性的解决方案(应在Windows,Linux,OSX上运行)可以为每个进程使用读取器线程,请参阅python中的对子进程的非阻塞读

  • 我试图杀死一个. exe与子进程。Popen. 解决方案为: taskkill/im(.exe)/t/f taskkill/pid(.exe)/t/f 由于响应被拒绝访问,因此无法工作。事实上,由于我从子流程运行cmd,我无法获得管理员权限。 我发现一个命令可以从cmd(不作为admin运行)中终止此进程,它是: ... 但当我用子进程运行它时,它会给我“无效查询”。我正在运行的命令是: 4)子过

  • 问题内容: 我对使用时如何搜索可执行文件感到困惑。如果给子进程提供了绝对路径,那么它就可以工作,但是我正在尝试使用相对路径。我发现,如果设置环境变量PYTHONPATH,则可以从该路径中获取导入的模块,并且PYTHONPATH在其中,但似乎对的行为没有帮助。我也尝试编辑将PYTHONPATH添加到的文件,就像这样 并验证了在以交互方式,与ipython或通过从命令行运行脚本启动python时,PY

  • 问题内容: 我正在python中使用subprocess模块​​运行一些shell脚本。如果shell脚本运行时间很长,我想杀死该子进程。我认为如果将其传递给我的陈述就足够了。 这是代码: 我已经用一些运行120秒的shell脚本测试了此调用。我期望子进程在30秒后被杀死,但是实际上该进程正在完成120秒脚本,然后引发了Timeout Exception。现在的问题是如何通过超时杀死子进程? 问题

  • 问题内容: Python版本:2.6.7 我在for循环中有以下subprocess.call,该循环被执行18次,但是,该过程始终挂在第19个循环上: 控制台输出如下所示: 由于我对python脚本不是很熟悉,所以我只是在徘徊我是否在做错什么…我怀疑某个地方出现了死锁。 会处理这些问题吗? 在什么情况下subprocess.call会挂起任何专家答案?非常感谢 问题答案: 当使用子过程时,我倾向