标签: subprocess

如何将整数值传递给 python 的 subprocess.call 方法?

我试图将一个整数值传入 python 的 subprocess.call 方法:

subprocess.call('samtools','view','-bq', '1','DS130.bam','>','DS130umr.bam')
Run Code Online (Sandbox Code Playgroud)

'-bq' 后面的参数需要是一个整数值。但是我相信 subprocess.call 一直将其视为字符串,因此我不断收到错误“TypeError: bufsize must be an integer”。

如何让 subprocess.call 将“1”解释为整数值?

python subprocess

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

Is there a way to make os.killpg not kill the script that calls it?

I have a subprocess which I open, which calls other processes.

I use os.killpg(os.getpgid(subOut.pid), signal.SIGTERM) to kill the entire group, but this kills the python script as well. Even when I call a python script with os.killpg from a second python script, this kills the second script as well. Is there a way to make os.killpg not stop the script?

Another solution would be to individually kill every child 1process. However, even using

p = psutil.Process(subOut.pid)
child_pid = p.children(recursive=True)
for …
Run Code Online (Sandbox Code Playgroud)

python subprocess

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

如何将 os.popen 设置为使用 Bash?

我有以下函数用于在 Python 中执行系统命令:

def engage_command(
    command = None
    ):
    #os.system(command)
    return os.popen(command).read()
Run Code Online (Sandbox Code Playgroud)

我正在使用os模块而不是subprocess模块,因为我正在处理一个与许多环境变量等交互的环境。

如何将 Bash 与这种类型的函数一起使用,而不是使用默认的shshell?

python bash operating-system subprocess

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

如何让子进程按顺序获取标准输出和标准错误?

示例测试文件(print.py):

import sys
print('stdout')
print('stderr', file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)

运行它的代码(x.py):

import subprocess
cmd = ['python', 'print.py']
print(subprocess.check_output(cmd, universal_newlines=True, stderr=subprocess.STDOUT))
Run Code Online (Sandbox Code Playgroud)

如果我从 shell 运行 print.py,它会首先打印 stdout。但是,如果我运行 x.py,它会首先打印 stderr。有什么办法可以让我以正确的顺序获得输出?

python subprocess

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

FileNotFoundError: [WinError 2] 系统找不到指定的文件

我目前正在学习如何使用该模块,subprocess而且我刚刚开始阅读我的新书。立即,我收到了一条我不明白的错误消息。

Traceback (most recent call last):
  File "D:/me/Python/subprocess.py", line 3, in <module>
    proc = subprocess.Popen(['echo', 'Hello there'], stdout=subprocess.PIPE)
  File "C:\Python34\lib\subprocess.py", line 859, in __init__
    restore_signals, start_new_session)
  File "C:\Python34\lib\subprocess.py", line 1112, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] The system can't find the specified file
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚这里出了什么问题

import subprocess

proc = subprocess.Popen(['echo', 'Hello there'], stdout=subprocess.PIPE)
out, err = proc.communicate()
print(out.decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

在书中他们说这段代码应该在屏幕上打印“Hello there”,但由于某种原因,它没有。

这里有什么问题?如果对您有帮助,我目前正在使用 python 3.4.3。

python subprocess python-3.x

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

在没有输入的情况下以设定的时间间隔刷新 tkinter 标签

在过去的几个小时里,我一直在尝试找到一种方法来刷新带有信息的标签,而无需自己输入任何内容。

我正在尝试编写的程序是从 Raspberry Pi 获取 CPU 温度并将其显示在窗口中。我需要让临时输入每 5 秒左右更新一次,但所有尝试都失败了。我尝试了 while 循环,发现它们在 tkinter 中不起作用,而且我想不出如何在没有输入的情况下不断刷新某些内容。我对 Python 很陌生,所以我确定有一种方法,但我还没有遇到过。此处的类似问题并不能得出适用于我的答案。

这是我现在的代码:

import subprocess
from tkinter import *

root = Tk()
root.title('CPU Temp')

cpuLab = Label(root, text = 'CPU Temp:',
               font =('Nimbus Mono L',14,),
               bg = 'black', fg = 'green').grid(row = 0, column = 0)

cpuTemp = subprocess.check_output(['/opt/vc/bin/vcgencmd', 'measure_temp'])

cpuVar = StringVar()
cpuDisplay = Label(root, textvariable = cpuVar,
                   font =('Nimbus Mono L',14),
                   bg = 'black', fg = 'green').grid(row = 0, column = 1)
cpuVar.set(cpuTemp[5:11])

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

这非常适合显示温度,只需重新运行即可刷新。

python subprocess tkinter raspbian

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

Python子进程没有输出

我使用的是 Python 3.5.1 和 Windows 10。我无法subprocess将输出显示在屏幕上。所以让我们从简单的事情开始:

import subprocess
process = subprocess.run('echo hi', shell=True, stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

当我运行我的 python 模块时,我希望它在 Python Shell 中打印“hi”。脚本运行并且不会返回错误,但它不会在屏幕上打印任何内容。

我也尝试了许多不同口味的subprocess(ie Popen),但仍然没有运气。我有一种感觉,这与我的 Windows/Python 环境的设置方式有关,但我真的不知道从哪里开始。想法?


更新

所以我现在明白我的原始代码示例不应该在屏幕上放置任何东西;然而,当我跑

import subprocess
p = subprocess.run('echo hi', shell=True)
Run Code Online (Sandbox Code Playgroud)

我没有输出。当我运行时:

import subprocess
p = subprocess.run('echo hi', shell=True, stdout=subprocess.PIPE)
print(p.stdout)
Run Code Online (Sandbox Code Playgroud)

我确实得到了输出。为什么第一个例子不起作用?

python windows shell subprocess python-3.x

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

Python subprocess.check_call() 无法识别 pushd 和 popd

我在 Ubuntu 15.04(显然不是选择)和 Python 3.4.3 上,我正在尝试执行如下内容。

subprocess.check_call("pushd /tmp", shell=True)
Run Code Online (Sandbox Code Playgroud)

我需要 ,shell=True因为我尝试执行的实际代码包含需要解释的通配符。但是,这给了我以下错误。

/usr/lib/python3.4/subprocess.py in check_call(*popenargs, **kwargs)
    559         if cmd is None:
    560             cmd = popenargs[0]
--> 561         raise CalledProcessError(retcode, cmd)
    562     return 0
    563 

CalledProcessError: Command 'pushd /tmp' returned non-zero exit status 127
Run Code Online (Sandbox Code Playgroud)

我试过在我的 Mac(El Capitan 和 Python 3.5.1)上做同样的事情,它工作得很好。我还尝试subprocess.check_call("ls", shell=True)使用 Python 3.4.3(用于完整性检查)在 Ubuntu 15.04 上执行,并且运行良好。作为最后的健全性检查,我pushd /tmp && popd在 Ubuntu 15.04 上的 Bash 中尝试了该命令,它也运行良好。所以不知何故,在(我的)Ubuntu 15.04 和 Python 3.4.3 上,subprocess.check_call()无法识别pushdpopd!为什么?

python bash subprocess python-3.x ubuntu-15.04

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

在unix后台运行python脚本

我有一个 python 脚本,我想在我的 unix 服务器的后台执行。问题是我需要 python 脚本等待上一步完成,然后才能进入下一个任务,但我希望我的工作在退出后继续运行。

我想我可以设置如下,但想确认:

脚本的摘录如下所示,其中命令 2 依赖于命令 1 的输出,因为它在同一目录中输出一个已编辑的可执行文件。我想指出的是,命令 1 和 2 没有包含 nohup/&。

subprocess.call('unix command 1 with options', shell=True)
subprocess.call('unix command 2 with options', shell=True)
Run Code Online (Sandbox Code Playgroud)

如果当我像这样启动我的 python 脚本时:

% nohup python python_script.py &
Run Code Online (Sandbox Code Playgroud)

我的脚本是否会在后台运行,因为我明确没有将 nohup/& 放在我的脚本 unix 命令中,而是在后台运行 python 脚本?

python unix subprocess nohup

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

使用 Subprocess 来避免长时间运行的任务断开 discord.py bot 的连接?

我为我的 Discord 服务器创建了一个机器人,它转到给定 subreddit 的 Reddit API,并根据您输入的 subreddit 在 Discord 聊天中发布当天的前 10 个结果。它无视自己的帖子,实际上只发布图片和 GIF。Discord 消息命令看起来像这样:=get funny awww news programming发布每个 subreddit 的结果,因为它从 Reddit API (PRAW) 获取它们。这没有问题。我知道 bot 能够访问 API 并发布到 discord 中。

我添加了另一个命令=getshuffled,它将来自 subreddits 的所有结果放在一个大列表中,然后在发布之前将它们打乱。这对于最多约 50 个 subreddits 的请求非常有效。

这是我需要帮助的:

因为它可以是如此大的结果列表,来自 100 多个 subreddit 的 1000 多个结果,机器人在非常大的请求上崩溃。根据我昨天从我的问题中得到的帮助,我明白出了什么问题。机器人正在启动,它正在与我的 Discord 服务器通信,当我向它传递一个很长的请求时,它在 Reddit API 调用完成后停止与服务器通信的时间太长,并且 Discord 连接失败。

因此,我认为我需要做的是为转到 Reddit API 并提取结果的代码创建一个子进程(我认为这将使不和谐连接保持运行),然后将这些结果传回给机器人当它完成时......

或者...这是 Asyncio 可以自行处理的事情...

正如我所知道的那样,我在子流程调用方面遇到了困难。

基本上,我要么需要关于这个子流程技巧的帮助,要么需要知道我是否是个白痴,而 Asyncio 可以为我处理所有这些。我认为这只是“我不知道我不知道什么”的例子之一。

总结一下:该机器人运行良好,改组了少量 subreddit。它通过发送的参数(它们是 subreddits),获取每个帖子的信息,然后在将链接发布到不和谐之前进行洗牌。问题是当它是一个更大的大约 50+ 的 subreddit 集时。为了让它与更大的数量一起工作,我需要让 Reddit …

subprocess python-3.x python-asyncio discord.py

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