Articles of subprocess

Python脚本和linux shell之间的交互

我有一个Python脚本,需要通过命令行与用户进行交互,同时logging输出的内容。 我目前有这样的: # lots of code popen = subprocess.Popen( args, shell=True, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stdout, executable='/bin/bash') popen.communicate() # more code 这就像在terminal中inputshell命令一样执行shell命令(例如adduser newuser02),包括交互行为。 这很好。 现在,我想从Python脚本中logging出现在屏幕上的所有内容。 但我似乎无法使这部分工作。 我已经尝试了使用subprocess.PIPE的各种方法,但是这通常会使交互性紊乱,就像不输出提示string一样。 我也尝试过不同的方法来直接改变sys.stdout的行为,但是当subprocess直接写入sys.stdout.fileno()时,这一切都没有用。

复制Pythonsubprocess的terminal输出

我正在调用忍者c / c + +构build系统的包装脚本,脚本是在Python中,它应该做的一件事是logging忍者和底层编译器的输出,但不抑制标准输出。 给我麻烦的部分是,忍者似乎检测到它正在写入terminal或不,所以简单地捕捉输出并发送到标准输出结束了改变它(最值得注意的是,忍者不填充屏幕列表警告和错误的构build文件,但删除最后成功build立的翻译单位的行,因为一个新的进来)。 有没有办法让忍者写入terminal,同时仍然捕获其输出? 写入到terminal应该发生在忍者subprocess运行,但是捕获所述输出可能要等到subprocess完成。

如何在运行时安装和导入Python模块?

我想写一个脚本来自动设置一个全新的Ubuntu安装并安装一个基于Django的应用程序。 由于脚本将在新服务器上运行,因此Python脚本需要自动安装一些必需的模块。 这是脚本。 #!/usr/bin/env python import subprocess import os import sys def pip_install(mod): print subprocess.check_output("pip install %s" % mod, shell=True) if __name__ == "__main__": if os.getuid() != 0: print "Sorry, you need to run the script as root." sys.exit() try: import pexpect except: pip_install('pexpect') import pexpect # More code here… pexpect的安装是成功的,但是下一行import pexpect失败了。 我认为它是因为在运行时代码不知道新安装的pexpect 。 如何在运行时安装和导入Python模块? […]

如何分配IP地址到Python中的接口?

我有python脚本,为我的无线和有线接口设置IP4地址。 到目前为止,我使用subprocess命令如: subprocess.call(["ip addr add local 192.168.1.2/24 broadcast 192.168.1.255 dev wlan0"]) 我怎样才能使用python库设置接口的IP地址? 如果有什么办法可以使用python库获得已经存在的IPconfiguration?

我怎样才能让Perl等待在system()后台启动的subprocess?

我有一些执行多个参数的shell脚本的Perl代码,为了简化,我假设我有这样的代码: for $p (@a){ system("/path/to/file.sh $p&"); } 之后我想做更多的事情,但是我无法find一种方法来等待所有的subprocess完成,然后再继续。 转换代码使用fork()将是困难的。 有没有更简单的方法?

Python 3.4.3 subprocess.Popen得到没有pipe道命令的输出?

我正在尝试将一个命令的输出分配给一个variables,而不是该命令的输出。 其原因在于,如果正在pipe理,正在讨论的命令会将未格式化的文本输出为输出,但如果正在从terminal运行,则会提供彩色格式的文本。 我需要得到这个颜色格式的文本。 到目前为止,我已经尝试了一些东西。 我已经尝试过Popen了: output = subprocess.Popen(command, stdout=subprocess.PIPE) output = output.communicate()[0] output = output.decode() print(output) 这可以让我打印输出,但它给了我input命令时得到的无格式输出。 这是有道理的,因为我在Python代码中将其pipe道化。 但是我很好奇,如果有一种方法可以将这个命令的输出直接分配给一个variables,而不需要运行pipe道本身的pipe道版本。 我也尝试了依赖于check_output的以下版本: output = subprocess.check_output(command) output = output.decode() print(output) 再次,我得到相同的未格式化输出,命令返回时,命令是pipe道。 有没有办法获得格式化的输出,命令通常从terminal给出的输出,当它不被pipe道?

在Linux / Python2.7的终止()后,多处理器。池中产生新的childern?

我有一个可执行文件,我需要经常运行,使用不同的参数。 为此,我使用多处理模块编写了一个小Python(2.7)包装器,遵循这里给出的模式。 我的代码如下所示: try: logging.info("starting pool runs") pool.map(run_nlin, params) pool.close() except KeyboardInterrupt: logging.info("^C pressed") pool.terminate() except Exception, e: logging.info("exception caught: ", e) pool.terminate() finally: time.sleep(5) pool.join() logging.info("done") 我的工作人员function在这里: class KeyboardInterruptError(Exception): pass def run_nlin((path_config, path_log, path_nlin, update_method)): try: with open(path_log, "w") as log_: cmdline = [path_nlin, path_config] if update_method: cmdline += [update_method, ] sp.call(cmdline, stdout=log_, stderr=log_) […]

将subprocess.Popen中的stdout保存到文件中,并在文件中写入更多内容

我正在写一个Python脚本,它使用subprocess.Popen执行两个程序(从编译的C代码),每个程序生成标准输出。 脚本获取该输出并将其保存到文件中。 由于输出有时足够大以致无法覆盖subprocess.PIPE,导致脚本挂起,所以我直接将stdout发送到日志文件。 我想让我的脚本写入文件的开始和结尾,以及两个subprocess.Popen调用之间。 但是,当我查看我的日志文件时,从脚本写入日志文件的所有内容都集中在文件顶部,其后是所有可执行文件stdout。 我怎样才能交叉我的文字添加到文件? def run(cmd, logfile): p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=logfile) return p def runTest(path, flags, name): log = open(name, "w") print >> log, "Calling executable A" a_ret = run(path + "executable_a_name" + flags, log) print >> log, "Calling executable B" b_ret = run(path + "executable_b_name" + flags, log) print >> […]

BASH:从两个inputstream中读取的最佳体系结构

这里简单的脚本: a)不断从套接字读取数据并将其存储在关联数组中 b)不断从标准input读取值,如果它们已经存在于关联数组中,则响应t / f a&b是随机事件,不以任何方式关联。 诀窍是从两个subprocess访问数组(因为在后台放置一个进程会产生一个subprocess) 我正在考虑通过最好的策略,并且发生了一些想法,但是我想知道有没有人有更好的想法: 1)将input从套接字redirect到stdin作为subprocess,并在一个while循环中处理两个input(数据大小很小,<30个字符,所以我猜他们将保持primefaces?)。 2)读取套接字,然后读取具有小(0.1?)超时值的STDIN,以模仿非阻塞I / O。 3)更新:将套接字数据写入一个文件(实际上有另一个进程直接写入一个文件),然后每次请求进来检查值是否存在,处理文件中的条目,将它们添加到数组(使用文件locking)。

使用subprocess.Popen通过SSH或SCP发送密码

我试图使用subprocess.Popen运行一个scp (安全复制)命令。 login要求我发送密码: from subprocess import Popen, PIPE proc = Popen(['scp', "user@10.0.1.12:/foo/bar/somefile.txt", "."], stdin = PIPE) proc.stdin.write(b'mypassword') proc.stdin.flush() 这立即返回一个错误: user@10.0.1.12's password: Permission denied, please try again. 我确定密码是正确的。 我可以通过在shell上手动调用scp来轻松validation它。 那么为什么这不工作? 请注意,对此有许多类似的问题,询问subprocess.Popen 。打开并发送自动SSH或FTPlogin密码: 我怎样才能从一个Python脚本在Linux设置用户密码? 使用subprocess发送密码 这些问题的答案不起作用和/或不适用,因为我正在使用Python 3。