2016-11-25 103 views
-1
正常运行

我已经在目录bash命令不会在Python

Co-sqp-C70.pdos_atm*5*C*_wfc*2*p* 
Copilot 

使用ls Co-sqp*过滤器下面的文件,以便输出

Co-sqp-C70.pdos_atm*5*C*_wfc*2*p* 

然而,在Python脚本,我使用

cmd = ["ls", self.prefix+".pdos_atm*wfc*"] 
output = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True).communicate()[0] 
print(output) 
return output.splitlines() 

和输出包含两个文件

Co-sqp-C70.pdos_atm*5*C*_wfc*2*p* 
Copilot 

我在做错了python代码导致脚本不能正确过滤ls输出?

+0

你有一个文件名与嵌入星号? – cdarke

+6

不要在Python中使用bash(除非你绝对需要)使用Python。查看'os'和'glob'库 – IanAuld

+0

@cdarke它是运行计算的程序的输出文件。我没有办法编辑输出文件名格式,所以脚本的目的是整理文件名 – noobProgrammer

回答

0

要扩展IanAuld的评论,我想为您提供两种解决方案,可以在不依赖调用子流程的情况下解决您的问题。使用子进程有点笨重,为了查找文件,python提供了几个强大的pythonic选项。

我创建了一个包含两个文件与你所描述的名字和父文件夹中的python脚本的文件夹命名的文件:

find_files.py 
files/ 
    Co-sqp-C70.pdos_atm*5*C*_wfc*2*p* 
    Copilot 

现在有几个选项来做到这一点:

import glob 
import os 

# a glob solution 
# you can use wildcards etc like in the command line 
print(glob.glob("files/Co-sq*")) 

# an os solution 
# you can walk through all files and only print/ keep those that start with your desired string 
for root, dirs, files in os.walk("files/"): 
    for file in files: 
     if file.startswith("Co-sq"): 
      print(file) 

我更喜欢glob解决方案来查找文件,因为它非常灵活且易于使用。顾名思义,glob允许您在命令行中使用glob patterns

0

您的命令不是bash它是ls。有没有参与,扩大你的文件名模式self.prefix+".pdos_atm*wfc*"外壳,让ls获取作为文字的说法,因为如果你想进入(中壳)

ls 'Co-sqp-C70.pdos_atm*wfc*' 

您至少有下列选项:

  1. 调用一个壳以扩大图案:

    cmd = [ "sh", "-c", "ls " + self.prefix + ".pdos_atm*wfc*"] 
    

    等价:

    cmd = "ls " + self.prefix + ".pdos_atm*wfc*" 
    

    如果self.prefix不能保证是shell-clean,这是有风险的。

  2. 展开水珠,并将结果传递给ls

    import glob 
    cmd = ["ls"] + glob.glob(self.prefix+".pdos_atm*wfc*") 
    

    你还在使用ls,这是不打算给解析的输出。除了简单地将输出传递给用户(例如在日志文件中)之外,不要做任何事情。

  3. 展开水珠,并处理在Python结果:

    import glob 
    for file in glob.glob(self.prefix+".pdos_atm*wfc*"): 
        some_function(file) 
    

    如果您要检查以任何方式文件条目你应该这样做。