标签: subprocess

subprocess.Popen 输出:如何克服命令行执行的差异

我正在编写一个 Python 脚本来比较两个文件。因此,我选择作为外部程序使用grep,启动以下两个命令:

grep -Fvf content1.txt content2.txt
grep -Fvf content2.txt content1.txt
Run Code Online (Sandbox Code Playgroud)

从这些命令的结果中可以看出差异,我可以通过计算行数来提取差异量。

为了在 Python 脚本中执行此操作,我将这些grep命令嵌入到subprocess.Popen()函数中:

try:
    output1, errors1 = subprocess.Popen(
        ["c:\\cygwin\\bin\\grep", "-Fvf", "content1.txt", "content2.txt"],
        shell=True, stdout=PIPE, stderr=PIPE).communicate()

    output2, errors2 = subprocess.Popen(
        ["c:\\cygwin\\bin\\grep", "-Fvf", "content2.txt", "content1.txt"],
        shell=True, stdout=PIPE, stderr=PIPE).communicate()

    if (len(output1) + len(output2) + len(errors1) + len(errors2) > 0):
        print("Result : there are differences:")

        if (len(output1) + len(output2) > 0):
            print("  Output differences : ")
            print(output1)
            # print (str(str(output1).count('\n'))); (*)
            print(output2)
            # print (str(str(output2).count('\n'))); (*) …
Run Code Online (Sandbox Code Playgroud)

python grep cygwin subprocess python-3.x

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

从另一个 python 脚本调用 python 脚本时,Python 日志记录挂起

我在 python 日志类中观察到这个奇怪的问题,我有两个脚本,一个是从另一个脚本调用的。第一个脚本等待其他脚本结束,而其他脚本使用记录一个巨大的日志logging.info

这是代码片段

#!/usr/bin/env python

import subprocess
import time
import sys

chars = ["/","-","\\","|"]
i = 0
command = 'sudo python /home/tejto/test/writeIssue.py'
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
while process.poll() is None:
    print chars[i],
    sys.stdout.flush()
    time.sleep(.3)
    print "\b\b\b",
    sys.stdout.flush()
    i = (i + 1)%4
output = process.communicate()
Run Code Online (Sandbox Code Playgroud)

另一个脚本是

#!/usr/bin/env python

import os
import logging as log_status

class upgradestatus():
    def __init__(self):
        if (os.path.exists("/tmp/updatestatus.txt")):
                os.remove("/tmp/updatestatus.txt")

        logFormatter = log_status.Formatter("%(asctime)s [%(levelname)-5.5s]  %(message)s")
        logger = log_status.getLogger()
        logger.setLevel(log_status.DEBUG)

        fileHandler = log_status.FileHandler('/tmp/updatestatus.txt', "a")
        fileHandler.setLevel(log_status.DEBUG)
        fileHandler.setFormatter(logFormatter) …
Run Code Online (Sandbox Code Playgroud)

python logging deadlock subprocess python-2.7

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

使用带有模块加载的 python 子进程

我目前在 unix 环境中使用 Python 2.7。我需要在 python 脚本中运行 R 脚本,但我无法使其工作,因为我的 R 模块需要先加载(使用“模块加载”)

这是我的 python 脚本:

import os
import subprocess as sp

os.system('module load R/3.2.3')
out = sp.check_output(['Rscript','test.R'], universal_newlines=True)
Run Code Online (Sandbox Code Playgroud)

我一直遇到同样的错误:“[Errno 2]没有这样的文件或目录”

任何想法 ?我看了这里这里但无法使其工作。

感谢您的帮助 !

python subprocess r

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

如何在Python中调用一个脚本并同时运行另一个脚本?

我想要完成的是从 Twitter 传输一小时的推文,将推文列表写入文件,清理并运行最近一小时的推文分析,然后无限期地重复该过程。

我遇到的问题是,如果我在处理流的同一脚本中运行推文的清理和分析 - 通过对其进行硬编码或从模块导入功能 - 整个脚本将等待这些过程完成,然后再次开始流式传输。有没有办法在流脚本中调用清理和分析模块,以便它们同时运行,并且在清理和分析发生时流不会停止?

我尝试通过使用subprocess.call('python cleaner.py', shell=True)和来实现此subprocess.Popen('python cleaner.py', shell=True)目的,但我真的不知道如何正确使用这些工具,上面的两个示例导致流媒体停止、cleaner.py运行,然后恢复流媒体。

python concurrency subprocess

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

无法使用 POpen 将参数传递给子进程

我目前正在研究为 ROS(机器人操作系统)创建一个通用配置工具。使用subprocess.POpen()并且Tkinter我正在创建treeview这样的:

在此输入图像描述

由于简洁的方式rospack list(列出系统上安装的所有软件包的命令,包括开发人员在其中创建自己的软件包的相应工作区中的软件包)的工作方式,前两列的创建相当简单:

ros_packages_install_retrieve = subprocess.Popen(["rospack list"], shell=True, stdout=subprocess.PIPE)
ros_packages_installed = []
for ros_package in ros_packages_install_retrieve.stdout.readlines():
    ros_package_adapted = ros_package.split(" ")
    ros_package_adapted[1] = ros_package_adapted[1][:-1]
    ros_packages_installed.append(ros_package_adapted)
Run Code Online (Sandbox Code Playgroud)

由于调用问题, “要求”列是一个棘手的问题rospack depends <package>(列出(如果有的话)系统上需要存在的所有软件包<package>,以便构建和/或运行)。对于里面的每个包,ros_packages_installed我调用以下函数:

def get_deps(ros_package):
    ros_package_deps_retrieve = subprocess.Popen(["rospack", "depends", ros_package], shell=True, stdout=subprocess.PIPE)
    ros_package_deps = []
    for ros_package_dep in ros_package_deps_retrieve.stdout.readlines():
        ros_package_dep = ros_package_dep.split("\n")
        ros_package_dep = ros_package_dep[:-1]
        ros_package_deps.append(ros_package_dep)

    return ros_package_deps
Run Code Online (Sandbox Code Playgroud)

问题是我得到了

[rospack]错误:没有给出包

并且返回值始终是一个空列表。我什至尝试将ros_package参数连接到命令本身,但一切都是徒劳的。

在我徒劳的尝试中,我发现了一些相当奇怪的事情。和实际上list都是depends传递给 …

python arguments subprocess popen ros

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

从 PID 设置活动/前台窗口

我正在尝试将程序(已知 PID)设置为顶部/活动/前景(不确定哪个最合适)。

PID设置为windows进程PID

    handle = win32api.OpenProcess( win32con.PROCESS_ALL_ACCESS,
                        False, pid)
    win32gui.SetForegroundWindow(handle)
    win32gui.SetActiveWindow(handle)
Run Code Online (Sandbox Code Playgroud)

我要么得到:

    pywintypes.error: (1400, 'SetForegroundWindow', 'Invalid window Handle.')

    pywintypes.error: (1400, 'SetActiveWindow', 'Invalid window handle.')
Run Code Online (Sandbox Code Playgroud)

我意识到这是处理程序中的问题,但我不确定我应该如何正确获取工作句柄。

python subprocess pywin32

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

终端最后一行类似 apt 的进度

我想编写一个 python 脚本,在终端的最后一行显示其当前进度,类似于apt(not apt-get) 的行为。我知道有 ANSI 控制序列可以与终端交互,但问题是我想调用其他程序(使用subprocess)来生成自己的输出。我不想让这些程序覆盖我的进度。

可能有多个子进程同时运行。我正在使用该multithreading模块,每个线程都会执行一些工作,然后调用并等待子进程,然后执行清理工作。我不介意子进程的输出被混合,只要最后一行不受影响。

当程序退出时,最后一行应该被清除。

python linux terminal subprocess

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

os.devnull 和 subprocess.pipe 有什么区别?

我一直在尝试如何通过将和分配给值来不打印Python的shell输出:subprocess.call()open(os.devnull, 'w')subprocess.PIPEstdout

subprocess.call(command, stdout=open(os.devnull, 'w'), shell=True)
Run Code Online (Sandbox Code Playgroud)

subprocess.call(command, stdout=subprocess.PIPE, shell=True)
Run Code Online (Sandbox Code Playgroud)

这两行都command谨慎地执行存储在变量中的 shell 命令,即不在终端上输出。但是,我不知道两者之间的区别。我刚开始使用subprocess.

/ogs

python shell subprocess

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

Python asyncio.subprocess():如何查看它是否仍在运行

对于由p以下创建的类对象asyncio.subprocess.Process

p = await asyncio.create_subprocess_exec(...)
Run Code Online (Sandbox Code Playgroud)

如何以非阻塞方式确定系统调用是否仍在运行?

subprocess python-3.x python-asyncio

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

Python 3.7 错误:AttributeError:模块“子进程”没有属性“运行”

我正在使用 python 3.7 在 pycharm 中运行以下代码。但出现此错误。

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

错误消息:AttributeError:模块“子进程”没有属性“运行”

python subprocess python-3.x python-3.7

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