尝试使用python的子进程模块使用其命令行界面来控制应用程序

时间:2018-02-12 19:56:43

标签: python shell subprocess

所以我使用DSI Studio程序,我正在做很多重复性的任务,我想自动化。它有一个命令行界面,可以使用命令

$request_url = 'https://#############.com/v1/pages/scene_23/views/view_36/records';

$request_body = '{"some_field":"some data"}';

$request_context = stream_context_create([
    'http' => [
        'method' => 'POST',
        'header' => [
            'X-Knack-Application-Id: ########################',
            'X-Knack-REST-API-Key: ########-####-####-####-############',
            'Content-Type: application/json',  
        ],
        'content' => $request_body,
        'ignore_errors' => true, // return error message, if any, in response_body
    ],
]);

$response_body = file_get_contents($request_url, false, $request_context);

var_dump($response_body);

它完全符合我的要求并输出文件。 但是当我尝试

dsi_studio --action=trk -source=HarveyReg2.hdr.src.gz.odf4.f5rec.012fx.rdi.gqi.0.2.fib.gz --method=0 --
seed=leftprechiasm.nii.gz --roi=1.nii.gz --fiber_count=100 --output=track5.trk

我返回返回代码1.如果我使用subprocess.run,会发生同样的事情。我对不同的排列进行了调整,但无济于事。我唯一能够获得0返回代码的是

import subprocess

subprocess.call("dsi_studio --action=trk --source=HarveyReg2.hdr.src.gz.odf4.f5rec.012fx.rdi.gqi.0.2.fib.gz --method=0 --fa_threshold=0.00000 --turning_angle=70 --step_size=0.01 --smoothing=0 --min_length=0.0 --max_length=300.0 --initial_dir=0 --seed_plan=0 --interpolation=0 --thread_count=12 --seed=leftprechiasm.nii.gz --roi=1.nii.gz --fiber_count=100 --output=track4.trk", shell=True)

我尝试过,因为这是我需要在cmd中使用命令的目录。但即便这样做,它仍然无法奏效。我是python的新手,我花了几天时间阅读像我这样的问题,但当我尝试通过模板匹配实现他们的解决方案时,我没有运气。

2 个答案:

答案 0 :(得分:2)

每个子进程调用都会创建自己的shell,因此cd实际上不会影响您以后的调用,因为您在错误的目录中会被中断。尝试

os.chdir("G:\Programs\dsi_studio_64")
subprocess.call("dsi_studio --action=trk --source=HarveyReg2.hdr.src.gz.odf4.f5rec.012fx.rdi.gqi.0.2.fib.gz --method=0 --fa_threshold=0.00000 --turning_angle=70 --step_size=0.01 --smoothing=0 --min_length=0.0 --max_length=300.0 --initial_dir=0 --seed_plan=0 --interpolation=0 --thread_count=12 --seed=leftprechiasm.nii.gz --roi=1.nii.gz --fiber_count=100 --output=track4.trk", shell=True)

您也可以使用cwd参数调用(),如

subprocess.call("your long command", cwd="directory")

答案 1 :(得分:0)

您可以使用subprocess.Popen。

#!/usr/bin/env python
#  -*- coding: utf-8 -*-

import subprocess

def run_process(exe):
    'Define a function for running commands and capturing stdout line by line'
    p = subprocess.Popen(exe.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    return iter(p.stdout.readline, b'')


if __name__ == '__main__':
    for line in run_process("G:\Programs\dsi_studio_64\dsi_studio --action=trk --source=HarveyReg2.hdr.src.gz.odf4.f5rec.012fx.rdi.gqi.0.2.fib.gz --method=0 --fa_threshold=0.00000 --turning_angle=70 --step_size=0.01 --smoothing=0 --min_length=0.0 --max_length=300.0 --initial_dir=0 --seed_plan=0 --interpolation=0 --thread_count=12 --seed=leftprechiasm.nii.gz --roi=1.nii.gz --fiber_count=100 --output=track4.trk"):
        print(line)