将通配符参数从 bash 传递到 python
passing wildcard arguments from bash into python
我正在尝试使用 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 调用您的脚本,如 python script.py *
以将所有文件作为参数传递。 argv[1:]
是一个数组切片,其中 returns 包含从 argv
从位置 1 到数组末尾的元素的列表。
我建议采用后一种方法,因为这意味着您只调用脚本的一个实例。
我正在尝试使用 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 调用您的脚本,如 python script.py *
以将所有文件作为参数传递。 argv[1:]
是一个数组切片,其中 returns 包含从 argv
从位置 1 到数组末尾的元素的列表。
我建议采用后一种方法,因为这意味着您只调用脚本的一个实例。