小编jas*_*r77的帖子

将stdout从subprocess.Popen保存到文件,再将更多内容写入文件

我正在编写一个python脚本,它使用subprocess.Popen来执行两个程序(来自编译的C代码),每个程序生成stdout.该脚本获取该输出并将其保存到文件中.因为输出有时足以压倒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 >> log, "More stuff"
    log.close()
Run Code Online (Sandbox Code Playgroud)

日志文件具有:调用可执行文件A调用可执行文件B更多内容[...来自两个可执行文件的标准输出...]

例如,有没有办法在调用Popen后将A的stdout刷新到日志中?还有一件事可能是相关的:可执行A开始然后在B上,并且在B打印完成后,A然后打印更多东西并完成.

我在RHE Linux上使用Python 2.4.

python linux subprocess stdout python-2.4

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

C代码改变终端文本颜色; 如何恢复默认值?Linux的

我在Linux上运行了一个C文件.它以红色(失败)打印一些线条,以绿色(通过)打印一些线条.正如您所料,它在printf语句中使用转义码,如下所示:

#define BLACK  "\033[22;30m"
#define GREEN  "\033[22;31m"

printf(GREEN "this will show up green" BLACK "\n");
Run Code Online (Sandbox Code Playgroud)

如果最后的BLACK不存在,终端文本将继续为所有内容为绿色.如果你没有抓住它,那对于具有非黑色背景的终端窗口来说没问题,但是否则你最终会得到黑底黑字.不好!运行程序有这个问题,捕获文本文件中的输出,然后使用"更多"或"更少"查看文件也是如此.

是否有代码恢复默认值而不是在printf语句的末尾指定颜色?这需要在C中,但我有兴趣阅读其他方法.

更新: 谢谢大家.您的回复帮助我在其他地方找到更有用的信息.我更新了我的宏如下(注意31是红色的,我修正了下面的拼写错误):

#define RESET_COLOR "\e[m"
#define MAKE_GREEN "\e[32m"

printf(MAKE_GREEN "this will show up green" RESET_COLOR "\n");
Run Code Online (Sandbox Code Playgroud)

我发现以下链接有助于理解这些代码的工作原理:

http://www.phwinfo.com/forum/comp-unix-shell/450861-bash-shell-escapes-not-working-via-putty-ssh.html 解释了这些转义序列的作用,并在可移植性时使用ncurses需要.

http://www.linuxselfhelp.com/howtos/Bash-Prompt/Bash-Prompt-HOWTO-6.html

http://bluesock.org/~willg/dev/ansi.html显示更多的转义序列; 有用的了解大局

c c++ linux terminal colors

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

在Linux上自动执行串行端口通信

我有一个Linux服务器(Red Hat 4),其中一个串口连接到嵌入式linux设备,另一个串口连接到该设备的电源控制器.我目前控制它们的方法是打开两个minicom会话,每个会话都在自己的窗口中.我想通过脚本自动化这种通信.起初,我开始思考如何自动使用minicom,然后意识到当脚本应该能够直接与端口通信时,我不需要尝试使用控制台应用程序进行自动化.

我知道一些Perl和一些python.我以前没有使用调制解调器通信的经验(使用AT命令).Perl有Device :: Modem,虽然它只是beta版,而Perl似乎是一个不错的选择,因为我更喜欢它的文本提取和争吵能力.但是,如果我需要学习如何控制调制解调器并编写/调试脚本,那么我的任务就会增加更多时间.

是否可以通过脚本以交互方式控制控制台应用程序(如minicom)?如果没有,有什么好资源让我学习如何使用调制解调器AT命令?或者是否有其他资源可以简化我的事情?

linux modem automated-tests serial-port

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

Mercurial和代码审查; 好工作流程?

我是一个小型分布式团队,使用Mercurial作为中央存储库.我们每个都通过ssh将它克隆到我们自己的linux盒子上.我们的目的是在将更改推送到中央存储库之前检查彼此的工作,以帮助保持中心的提示清洁.在不同的Linux机器上开发人员之间共享代码的好方法是什么?我是Mercurial的新手.我能想到的选择(通过阅读,而不是经验)是:

1:作者提交所有本地更改并使用中心提示更新工作克隆.作者使用hg bundle,如果有办法指定要包含在哪个本地转速中.(一个实验显示我"捆绑"只抓取未经修改的更改,即使之前有中央不知道的本地提交)作者将捆绑文件提供给审阅者.Reviewer从中心的提示创建一个新的干净克隆,并将该包导入该克隆.要么,

2:在作者和评论者从中心提示中获取后,作者使用补丁和审阅者导入补丁.要么,

3:作者推向审稿或审阅从笔者拉(但如何,正是我读什么是只是为了提升和从原来担任仓库拉到/和/或在同一个盒子,而不是不同的Linux框之间?).

4:忘记在推送到中心之前检查代码; 继续推进,使用标签来识别已经审查过的内容,并使用Hudson(已经工作)来标记最新的安全版本,以便团队成员可以知道从哪一个开始.

如果您的团队使用Mercurial并进行代码审核,您如何让审核人员查看您的更改?

mercurial pull-request

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

使用python脚本从不同目录调用make

我需要在一个Python脚本中调用make(构建一个makefile),该目录与我所在的目录不同.如果我只是这样做:

build_ret = subprocess.Popen("../dir1/dir2/dir3/make",
                     shell = True, stdout = subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:/ bin/sh:../ dir1/dir2/dir3/make:没有这样的文件或目录

我试过了:

build_ret = subprocess.Popen("(cd ../dir1/dir2/dir3/; make)",
                     shell = True, stdout = subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

但make命令被忽略.我甚至没有得到"没有什么可以构建"的消息.

我也试过使用"沟通",但没有成功.这是在Red Hat Linux上运行的.

python linux

7
推荐指数
2
解决办法
5421
查看次数

覆盖静态库中定义的C函数

我有一个C文件的静态库,在Cygwin上用g ++编译.我希望单元测试库中定义的一个函数.该函数调用该库中定义的另一个函数,我希望覆盖依赖项以将其替换为我自己的该函数版本.我无法修改静态库中的内容,因此此解决方案[ 覆盖C中的函数调用 ]不适用.

通常,我可以编写.cpp文件并包含.c文件,其中包含我想要单元测试的函数,它实际上使用我添加的代码扩展了该文件.这是一个我从未用于生产代码的肮脏技巧,但它对于单元测试C文件很方便,因为它使我的测试代码能够访问该C文件中的静态内容.然后,我可以写我的假依赖版本,以及调用我正在测试的函数的单元测试函数.我编译my.cpp来获取my.o,然后将其与静态库链接.从理论上讲,由于链接器已经找到了依赖关系的定义(我提供的那个),因此它不会在库中查找,也不会发生冲突.通常这可行,但现在我得到一个"多重定义"错误,链接器首先找到我的假,然后找到真正的假.我不知道是什么原因引起的,不知道该找什么.我也不能把它归结为一个简单的例子,因为我的简单例子没有这个问题.

想法好吗?

c gcc cygwin g++

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

Mercurial changegroup挂钩未触发; Linux的

我有一个服务器,它服务于一个"中央"Mercurial存储库; 团队克隆它并通过ssh将其更改推送到它.Hudson安装在同一台服务器上(RHEL 5.5).每当有人推送到Mercurial中央存储库时,我希望触发一个Hudson构建.我还希望在推送时发送通知电子邮件.

在ProjectName/.hg/.hgrc中,有以下内容:

[hooks]
changegroup.hudson = wget http://Server.Name:8080//job/Project_Name/builds?delay=0sec >&2
Run Code Online (Sandbox Code Playgroud)

如果我使用putty ssh到这个服务器,然后发出wget命令,成功触发了一个构建,所以我不认为这是一个权限问题.

另一个钩子是:

changegroup.notify = /the/path/.hg/hooks/notify
Run Code Online (Sandbox Code Playgroud)

通知的地方是:

dest='comma separated list of email addresses'
repo="path/to/repository/"
subject="New changesets in $repo"

hg glog -l 10 -r $HG_NODE: | mail -s "$subject" $dest
Run Code Online (Sandbox Code Playgroud)

当我直接从shell运行./notify时,当我在中央存储库的路径中时,邮件会正确发送; 如果我从我的主目录执行通知,找不到存储库,我收到一封空邮件,但至少我收到一封电子邮件.我假设这些钩子没有被运行.

可能会阻碍什么?我该怎么检查?

mercurial hook continuous-integration hudson

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

Cygwin和Windows路径冲突; 同时使用Windows和cygwin Python

我在Windows XP上安装了cygwin.在Windows上安装了一些软件之后,Mercurial on cygwin停止了工作.症状可以简化为python无法在其库中找到模块:

>>> import os
Traceback (most recent call last):
  file "<stdin>", line 1, in <module>
ImportError: No module named os
Run Code Online (Sandbox Code Playgroud)

我在Windows(subversion)中安装的软件之一使用python,所以现在Windows有自己的Python安装.不要问为什么我希望在Windows下的cygwin和subversion下使用mercurial; 我已经足够说了,但那不是重点.似乎cygwin试图使用Windows python而不是它自己,或者至少我认为正在发生这种情况.如果那不是原因,请赐教.无论如何...

$ find/cygdrive/c -name os.py /cygdrive/c/csvn/Python25/Lib/os.py /cygdrive/c/cygwin/lib/python2.6/os.py

echo $ PATH确认/ cygdrive/c/csvn/Python25在/usr/lib/python2.6之前.我不是cygwin wiz,但是从我可以告诉/ etc/profile添加Windows路径到cygwin的$ PATH,我不知道如何阻止它这样做.作为一种解决方法,我修改了.profile以显式设置PATH,从Windows中排除这些路径.但是,问题仍然存在:

$ echo $PATH
/usr/local/bin:/usr/bin:/usr/lib/python2.6
$ hg
'import site' failed; use -v for traceback
Traceback (most recent call last):
  File "/usr/bin/hg", line 10, in <module>
    import os
ImportError: No module named os

$ ls /usr/lib/python2.6/os.py
/usr/lib/python2.6/os.py
Run Code Online (Sandbox Code Playgroud)

看起来路径冲突实际上并没有得到解决,因为当我再次发出上面的"find"命令时,我会得到相同的结果,首先显示/cygdrive/c/csvn/Python25/Lib/os.py.从理论上讲,python可能还有其他一些原因不能用于cygwin,但是无法控制我的PATH仍然是个问题.有任何想法吗?

python svn mercurial cygwin

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