为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕沐林林 2022-11-09 14:49:14
我在从脚本调用命令行时遇到困难。我运行脚本但没有得到任何结果。通过我脚本中的这个命令行,我想运行一个工具,该工具生成一个文件夹,其中包含每行的输出文件。输入路径已经定义。你能帮我么?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)
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

您真的想使用 Python 标准库模块subprocess。使用该模块中的函数,您可以将命令行构建为字符串列表,并且每个字符串都将作为一个文件名、选项或值进行处理。这绕过了 shell 的转义,并消除了在调用之前对脚本参数进行按摩的需要。

此外,您的代码将不起作用,因为for语句的主体块没有缩进。Python 根本不会接受此代码(您可能会在没有适当缩进的情况下粘贴到 questiong 中)。



查看完整回答
反对 回复 2022-11-09
?
偶然的你

TA贡献1841条经验 获得超3个赞

我通常对静态命令这样做


from subprocess import check_output


def 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_output

from shlex import split


def 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_output

from shlex import split


def 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:我没有测试这个


查看完整回答
反对 回复 2022-11-09
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

如前所述,不推荐执行命令 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


查看完整回答
反对 回复 2022-11-09
  • 3 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信