将通配符参数从bash传递到python

将通配符参数从bash传递到python,python,bash,scripting,arguments,Python,Bash,Scripting,Arguments,我试图通过编写一个简单的脚本来练习python脚本,该脚本将获取一系列名为a_B的文件,并将它们写入位置B\a。我将参数传递到文件的方式是 python script.py * 我的程序看起来像 from sys import argv import os import ntpath import shutil script, filename = argv target = open(filename) outfilename = target.name.split('_') ou

我试图通过编写一个简单的脚本来练习python脚本,该脚本将获取一系列名为a_B的文件,并将它们写入位置B\a。我将参数传递到文件的方式是

python script.py *
我的程序看起来像

from sys import argv
import os
import ntpath
import shutil

script, filename = argv

target = open(filename)

outfilename = target.name.split('_') 

outpath=outfilename[1]
outpath+="/"
outpath+=outfilename[0]

if not os.path.exists(outfilename[1]):
    os.makedirs(outfilename[1])

shutil.copyfile(target.name, outpath)

target.close()
这样做的问题是,当前编写的脚本设置为一次只接受1个文件。最初我希望通配符一次将一个文件传递给脚本,然后每次执行脚本

我的问题涉及两种情况:

  • 如何将通配符文件一次传递给脚本
  • 如何修改此脚本以接受所有参数?(我可以处理列表化的一切,但argv是我遇到的问题,我有点不确定如何创建文件列表)

  • 您有两个选项,这两个选项都涉及一个循环

    要逐个传递文件,请使用shell循环:

    for file in *; do python script.py "$file"; done
    
    这将为与glob
    *
    匹配的每个文件调用一次脚本

    要处理脚本中的多个文件,请使用循环:

    from sys import argv
    for filename in argv[1:]:
        # rest of script
    
    然后从bash调用脚本,比如
    pythonscript.py*
    ,将所有文件作为参数传递
    argv[1://code>是一个数组切片,它返回一个包含
    argv
    中从位置1开始到数组末尾的元素的列表


    我建议使用后一种方法,因为这意味着您只调用脚本的一个实例。

    All
    python script.py*
    does设置为
    filename='*'
    。如果你想让它成为一个通配符,你需要在你的脚本中处理它。@jornsharpe这不是真的,
    *
    被shell扩展,所有匹配的文件都被传递给脚本。Tom肯定是正确的,因为我收到的错误是“值太多,无法解包”@TomFenech啊,我想这可能是shell相关的,这不会发生在Windows命令上prompt@Skyler那么,为什么不让
    filenames=argv[1://code>在上面迭代呢?不管它是否包含一个、一个或多个,而且你从来没有实际使用过
    script
    。你能再补充一点来解释argv[1:]到底是什么吗,这是我第一次遇到它(对python还是很陌生,但对其他语言有经验)@Skyler当然,我添加了一句解释数组片段的句子