我试图将一个整数值传入 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”解释为整数值?
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 中执行系统命令:
def engage_command(
command = None
):
#os.system(command)
return os.popen(command).read()
Run Code Online (Sandbox Code Playgroud)
我正在使用os模块而不是subprocess模块,因为我正在处理一个与许多环境变量等交互的环境。
如何将 Bash 与这种类型的函数一起使用,而不是使用默认的shshell?
示例测试文件(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。有什么办法可以让我以正确的顺序获得输出?
我目前正在学习如何使用该模块,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。
在过去的几个小时里,我一直在尝试找到一种方法来刷新带有信息的标签,而无需自己输入任何内容。
我正在尝试编写的程序是从 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 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)
我确实得到了输出。为什么第一个例子不起作用?
我在 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()无法识别pushd和popd!为什么?
我有一个 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 脚本?
我为我的 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 ×10
python ×9
python-3.x ×4
bash ×2
discord.py ×1
nohup ×1
raspbian ×1
shell ×1
tkinter ×1
ubuntu-15.04 ×1
unix ×1
windows ×1