subprocess.call命令用于执行“ci -u <filename>”

时间:2016-01-13 22:00:50

标签: python rcs

我正在尝试执行首先创建新文件(如果它不存在)的python脚本,然后执行ci(在新创建的文件上)以创建具有初始修订号的rcs文件。但是当我运行脚本时,它会要求我描述并以句点“。”结束。我希望这部分使用默认描述自动化,并在没有用户输入的情况下创建rcs文件。任何帮助将非常感激。以下是我的代码:

import os
import subprocesss

if os.path.isfile(location):

    print "File already exists"

else:

    f = open(location,'a')
    subprocess.call(["ci", "-u", location])
    f.close()
    print "new file has been created"

我试过了,我收到以下错误:

导入os

导入子流程

如果os.path.isfile(location):

    print "File already exists"

否则:

    f = open(location,'a')
    cmd = "ci -u "+location
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
    stdout_data = p.communicate(input='change\n.')[0]
    f.close()
    print "new file has been created"

追踪(最近一次通话):   文件“testshell.py”,第15行,in     p = subprocess.Popen(cmd,stdout = subprocess.PIPE,stderr = subprocess.STDOUT,close_fds = True)   在 init 中输入文件“/usr/local/pythonbrew/pythons/Python-2.7/lib/python2.7/subprocess.py”,第672行     errread,errwrite)   _execute_child中的文件“/usr/local/pythonbrew/pythons/Python-2.7/lib/python2.7/subprocess.py”,第1201行     提出child_exception OSError:[Errno 2]没有这样的文件或目录

1 个答案:

答案 0 :(得分:0)

您可以使用subprocess.call的stdin参数为子进程提供一个类似文件的对象作为其标准输入(您手动输入的内容)。

StringIO模块包含一个名为StringIO的类,它为内存中的字符串提供类似文件的接口。

将这两个部分组合在一起将允许您将特定字符串发送到ci,就像用户手动输入一样

from StringIO import StringIO
import subprocess

...

subprocess.call(['command', 'with', 'args'], stdin=StringIO('StandardInput'))

或者,正如CharlesDuffy建议的那样,你可以使用Popen及其沟通方法:

import subprocess
proc = subprocess.Popen(['command', 'with', 'args'],
    stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate('StandardInput')