shell 如何在Python中防止子进程输出到stdout?

wa7juj8i  于 6个月前  发布在  Shell
关注(0)|答案(1)|浏览(72)

我需要使用Python运行一个进程,然后在它挂起时杀死它,然后将其重新命名。我不希望第二个进程污染我的shell标准输出。但是无论我做什么,子进程的输出都会写入shell。顺便说一下,我使用的是Linux。
这就是我的:

server_command = "./start.sh >/dev/null 2>&1"
server_cwd = "/home/mehran/Project"

process = subprocess.Popen(server_command,
                           shell=False,
                           cwd=server_cwd,
                           stdout=subprocess.DEVNULL,
                           stderr=subprocess.DEVNULL)

字符串
正如我提到的,这仍然会将子进程的输出打印到shell。我也尝试了所有其他我能想到的组合(没有>/dev/null 2>&1,然后没有subprocess.DEVNULL

[更新]

为了回答一些评论,我测试了以下案例,结果相同:

  • shell=True
  • [server_command]
  • stdin=subprocess.DEVNULL

我添加了最后一个,即使start.sh脚本不从stdin读取任何东西。TBH,我没有完全阅读脚本,但据我所知,它做了一个conda activate .并运行另一个python程序。问题是,我宁愿不碰那个脚本并抑制输出,无论脚本中的情况如何。

[更新]

当我在这样的终端中手动运行脚本时,我忘了提到这一点:

./start.sh >/dev/null 2>&1


我得到no output,这让我想知道为什么从Python代码调用时相同的方法不起作用!

[更新]

如果有人有兴趣复制这个问题,请克隆以下项目:
https://github.com/oobabooga/text-generation-webui
然后运行:

./start_linux.sh --api


这是我试图在代码中控制的脚本。只是你还需要发送一个HTTP请求来加载一个模型,以查看我提到的输出:

curl --request POST \
  --url http://localhost:5000/api/v1/model \
  --header 'Content-Type: application/json' \
  --data '{"action": "load", "model_name": "TheBloke_WizardLM-1.0-Uncensored-CodeLlama-34B-AWQ"}'


model_name指的是你已经下载到应用程序中的一个模型。实际上很简单。

euoag5mw

euoag5mw1#

通常只使用subprocess.DEVNULL就足够了,但使用PIPE几乎总是更好

p = subprocess.Pppen(
    command,  # tuple or list, can use shlex.split()
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE,
    # text=True,  # don't need to .encode()
)
out, err = p.communicate()  # opportunity to pass stdin
if p.returncode != 0:
    # handle failure, maybe now display out, err
# now use out for purposes

字符串
如果您处理仍然写入控制台的输出,它将使用正常的输出机制,而不使用stdoutstderr

相关问题