将通配符参数从bash传递到python
我试图通过编写一个简单的脚本来练习python脚本,该脚本将获取一系列名为a_B的文件,并将它们写入位置B\a。我将参数传递到文件的方式是将通配符参数从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 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个文件。最初我希望通配符一次将一个文件传递给脚本,然后每次执行脚本
我的问题涉及两种情况:
您有两个选项,这两个选项都涉及一个循环 要逐个传递文件,请使用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开始到数组末尾的元素的列表
我建议使用后一种方法,因为这意味着您只调用脚本的一个实例。Allpython script.py*
does设置为filename='*'
。如果你想让它成为一个通配符,你需要在你的脚本中处理它。@jornsharpe这不是真的,*
被shell扩展,所有匹配的文件都被传递给脚本。Tom肯定是正确的,因为我收到的错误是“值太多,无法解包”@TomFenech啊,我想这可能是shell相关的,这不会发生在Windows命令上prompt@Skyler那么,为什么不让filenames=argv[1://code>在上面迭代呢?不管它是否包含一个、一个或多个,而且你从来没有实际使用过script
。你能再补充一点来解释argv[1:]到底是什么吗,这是我第一次遇到它(对python还是很陌生,但对其他语言有经验)@Skyler当然,我添加了一句解释数组片段的句子