我尝试构建脚本,在日志中执行一些grep搜索并打印结果。我尝试使用特使,因为它比子进程更容易,但是当我执行grep命令时,它会给我一个错误,没有这样的文件o目录。
dir结构很简单:
我的test.py很简单:
import envoy
def test(value):
search = "grep 'cv="+str(value)+"' ./web_logs/log/log_*"
print(search) #check of the search string
r = envoy.run(search)
print(r.status_code, r.std_out, r.std_err)#check of the command
response = r.std_out
if __name__ == "__main__":
test(2)产出如下:
grep 'cv=2' ./web_logs/log/log_*
(2, '', 'grep: ./web_logs/log/log_*: No such file or directory\n')如果我运行相同的命令:
grep 'cv=2' ./web_logs/log/log_*我可以在日志文件中找到字符串"cv=2“的出现。
错误在哪里?
更新后的答案问题是在使用*的问题上,特使没有使用glob模块就不能爆炸,所以我使用它的子过程,并试图更好地研究glob模块的使用来改进特使。
我使用的新代码是:
import subprocess
def test(value):
search = "grep 'cv="+str(value)+"' ./web_logs/log/log_*"
print(search) #check of the search string
proc = subprocess.check_output(search, shell=True)
print proc.split('\n')
if __name__ == "__main__":
test(2)发布于 2016-08-21 17:34:06
@baptistemm实际上是正确的,因为您没有将bash作为您的过程的一部分运行,所以全球化是不起作用的。
然而,正在发生的事情更深一些。
当您运行一个子进程时,它可以由几个系统服务(系统调用)中的一个来完成。
简短答复(TLDR;)
以下是正确的方法:
import envoy
def test(value):
search = "/bin/sh -c \"grep 'cv="+str(value)+"' ./web_logs/log/log_*\""
print(search) #check of the search string
r = envoy.run(search)
print(r.status_code, r.std_out, r.std_err)#check of the command
response = r.std_out
if __name__ == "__main__":
test(2)将该命令作为shell命令运行将负责全局操作。
长答案
每当执行子进程时,它最终会被转换为execve系统调用(或等效的)。
在C库中,有一些助手函数,比如system(3)和popen(3),它们围绕着execve(2)来提供执行进程的更简单的方法。system启动一个shell并将其参数传递给shell的-c选项。波彭会做额外的魔法,就像特使在蟒蛇身上做的那样。
在使节中,将在使节代码中为| (参见def expand_args(command):)解析该参数。然后使用等效的popen来执行进程。envoy本质上就是shell对|标记所做的事情(将事情拆分到|中,然后使用|)。
特使没有像shell那样解释*,就像使用某种glob函数扩展它以匹配文件一样。巴什有。这就是我的答案。
一个有趣的练习将是你贡献代码给特使:-)并使它做全球化。
发布于 2016-08-21 17:19:42
它为什么在终端机上工作,而在特使中却不工作,这与全球化(巴什实例)有关。
当你在终点站运行时
grep 'cv=2' ./web_logs/log/log_*bash将解析命令行,并将星号替换为匹配的每一个文件。因此,如果您有./web_logs/log/log_1 ./web_logs/log/log_2和./web_logs/log/log_foo,那么您的命令实际上将是
grep 'cv=2' ./web_logs/log/log_1 ./web_logs/log/log_2 ./web_logs/log/log_foo当您在使节中执行相同的操作时,这是不同的,它不会执行文件的全局化,然后它将传递给grep一个名为./web_logs/log/log_*的文件,它不存在,这实际上是由您在问题中粘贴的行所证实的。
print r.std_err
'grep: ./web_logs/log/log_*: No such file or directory\n'ps:有一个用于python的glob模块
https://stackoverflow.com/questions/39052191
复制相似问题