我需要使用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
指的是你已经下载到应用程序中的一个模型。实际上很简单。
1条答案
按热度按时间euoag5mw1#
通常只使用
subprocess.DEVNULL
就足够了,但使用PIPE
几乎总是更好字符串
如果您处理仍然写入控制台的输出,它将使用正常的输出机制,而不使用
stdout
和stderr
流