相关疑难解决方法(0)

具有修改环境的Python子进程/ Popen

我认为运行带有稍微修改环境的外部命令是一种非常常见的情况.这就是我倾向于这样做的方式:

import subprocess, os
my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
Run Code Online (Sandbox Code Playgroud)

我有一种直觉,觉得有更好的方法; 看起来好吗?

python subprocess popen

255
推荐指数
6
解决办法
16万
查看次数

如何使用call/Popen继承环境变量来调用子进程

首先,对我所确定的显而易见的道歉是我对bash,shell和子进程的基本理解.

我正在尝试使用Python来自动调用一个名为Freesurfer的程序(实际上,我正在调用的子程序称为recon-all.)

如果我直接在命令行执行此操作,我将"源"一个名为mySetUpFreeSurfer.sh的脚本,除了设置三个环境变量之外什么都不做,然后"源"另一个脚本FreeSurferEnv.sh.FreesurferEnv.sh在我看来并没有做任何事情,只是设置了很多环境变量并向终端回应了一些东西,但它比其他bash脚本更复杂,所以我不确定.

这就是我现在所拥有的:

from subprocess import Popen, PIPE, call, check_output
import os

root = "/media/foo/"

#I got this function from another Stack Overflow question.

def source(script, update=1):
    pipe = Popen(". %s; env" % script, stdout=PIPE, shell=True)
    data = pipe.communicate()[0]
    env = dict((line.split("=", 1) for line in data.splitlines()))
    if update:
        os.environ.update(env)
    return env

source('~/scripts/mySetUpFreeSurfer.sh')
source('/usr/local/freesurfer/FreeSurferEnv.sh')

for sub_dir in os.listdir(root):
    sub = "s" + sub_dir[0:4]
    anat_dir = os.path.join(root, sub_dir, "anatomical")
    for directory in os.listdir(anat_dir):
        time_dir = os.path.join(anat_dir, directory)
        for d in …
Run Code Online (Sandbox Code Playgroud)

python bash shell subprocess environment-variables

12
推荐指数
2
解决办法
1万
查看次数

为什么这个Python子进程命令仅在Windows上的shell = True时有效?

我有一个涉及多个subprocess.call命令的python脚本.我在Mac上编写了脚本,它运行得很好.我刚尝试在Windows上运行它,我对错误感到困惑.

以下命令调用ImageMagick返回"退出状态4":

file1 = "D:/Temp/OCR_test/sample/images/crops/time_0011.png"
subprocess.call(['convert', file1, '-resize', '200%', file1])
Run Code Online (Sandbox Code Playgroud)

将命令更改为以下作品:

subprocess.call(['convert', file1, '-resize', '200%', file1], shell=True)
Run Code Online (Sandbox Code Playgroud)

shell=True由于文档中的警告,我有点担心使用.
我还需要命令在Mac和Windows上工作,我很困惑为什么它不能在Windows上工作(我检查过命令确实可以使用Windows CMD).

有趣的是,以下行脚本早期工作(其中file,lat_crop1croplat被定义的变量):

subprocess.call(['ffmpeg', '-loglevel', 'panic', '-i', file, '-vf', lat_crop1, '-n', croplat])  
Run Code Online (Sandbox Code Playgroud)

我读了这个问题并尝试了所有建议(shlex,我的命令的变化等等),但我仍然得到相同的结果.

任何人都知道如何修改该行,以便它可以无需工作shell=True

另外,"退出状态4"是什么意思?我用Google搜索并阅读了如此多的文档但却一无所获.

编辑:根据答案中提供的信息,我更改为无法工作的命令,并subprocess.call(['mogrify', file1, '-resize', '200%', file1])在Windows上的Python中成功运行.幸运的是,ImageMagick提供mogrify了替代方案convert.

python windows subprocess imagemagick windows-7

5
推荐指数
1
解决办法
1480
查看次数