使用python,Ubuntu OS从脚本调用命令行

我在从脚本调用命令行时遇到困难。我运行脚本但没有得到任何结果。通过我脚本中的这个命令行,我想运行一个工具,该工具生成一个文件夹,其中包含每行的输出文件。输入路径已经定义。你能帮我么?


for line in inputFile:

cmd = 'python3 CRISPRcasIdentifier.py -f %s/%s.fasta -o %s/%s.csv -st dna -co %s/'%(inputpath,line.strip(),outputfolder,line.strip(),outputfolder)

os.system(cmd)


慕沐林林
浏览 200回答 3
3回答

吃鸡游戏

您真的想使用 Python 标准库模块subprocess。使用该模块中的函数,您可以将命令行构建为字符串列表,并且每个字符串都将作为一个文件名、选项或值进行处理。这绕过了 shell 的转义,并消除了在调用之前对脚本参数进行按摩的需要。此外,您的代码将不起作用,因为for语句的主体块没有缩进。Python 根本不会接受此代码(您可能会在没有适当缩进的情况下粘贴到 questiong 中)。

偶然的你

我通常对静态命令这样做from subprocess import check_outputdef sh(command):    return check_output(command, shell=True, universal_newlines=True)output = sh('echo hello world | sed s/h/H/')但这不安全!!!你应该做的shell注入很容易from subprocess import check_outputfrom shlex import splitdef sh(command):    return check_output(split(command), universal_newlines=True)output = sh('echo hello world')差异是微妙但重要的。shell=True 将创建一个新的外壳,因此管道等将起作用。当我有一个带有管道的大命令行并且是静态的时,我会使用它,我的意思是,它不依赖于用户输入。这是因为这个变体对 shell 注入很敏感,用户可以输入something; rm -rf /并且它会运行。第二种变体只接受一个命令,它不会生成 shell,而是直接运行命令。所以没有管道和这样的外壳会起作用,而且更安全。universal_newlines=True用于将输出作为字符串而不是字节。将它用于文本输出,如果您需要二进制输出,只需省略它。默认值为假。所以这是完整的例子from subprocess import check_outputfrom shlex import splitdef sh(command):    return check_output(split(command), universal_newlines=True)for line in inputFile:    cmd = 'python3 CRISPRcasIdentifier.py -f %s/%s.fasta -o %s/%s.csv -st dna -co %s/'%(inputpath,line.strip(),outputfolder,line.strip(),outputfolder)    sh(cmd)ps:我没有测试这个

牧羊人nacy

如前所述,不推荐执行命令 vias: os.system(command)。请使用 subprocess (在 python 文档中阅读有关此模块subprocess_module_docs)。在这里查看代码:for command in input_file:    p = subprocess.Popen(command, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)    # use this if you want to communicate with child process    # p = subprocess.Popen(command, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)    p.communicate()    # --- do the rest
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python