2017-01-23 107 views
0

我有几个命令行界面命令可以使用Windows命令提示符执行。我用来检索的命令很少文件从CVS库使用命令提示符。现在我想通过一个python脚本来执行这些命令。我发现我必须使用子进程来通过python脚本与命令提示符进行交互。我试图运行下面这段代码通过HEAD从CVS存储库中检索文件。当我试图直接从命令提示符执行这些命令时,它们会正确执行。我可以看到它创建了一个本地工作区并正确检索文件。但是当我执行python脚本,它不会执行任何操作。我需要您的帮助。我也希望通过标记来检索文件。根据用户指定的输入从python脚本执行windows命令行从CVS存储库检索文件

import os 
import sys 
import subprocess 

Current_Working_Directory=os.getcwd() 
print "Current_Working_Directory",Current_Working_Directory 

cmd = ['cvs', 
    '-d:::pserver:<username>@<computername>:<repository> 
    'login'] 
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
output=p.communicate() 
print "p",p 
cmd1=['set','CVSROOT','=','pserver:<username>@<computername>:<repository>'] 
p1 = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
print p1 
cmd2=['cvs','co','-r','HEAD','Test'] 
p2 = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
print p2 

回答

0

运行subprocess.Popen创建一个新的子过程。环境变量CVSROOT只存在于该子进程的简短存在中,所以它不会存在于执行cvs命令的下一个Popen中。您想改为使用os.environ["CVSROOT"] = 'pserver:<username>@<computername>:<repository>'

事实上,如果你在cvs login之前这样做了,你不需要在该命令中明确地指定它。

另一种方法是在cvs co命令中指定带有-d的cvsroot,就像您对cvs login命令所做的那样。

+0

其实如果我尝试运行上面的code.It不从CVS存储库中检索文件,而如果它尝试在命令提示符下运行这些命令,文件被正确提取,我可以在我的本地工作区中看到这些文件。我如何使用python脚本检索文件? – user1681102

+0

你做了什么来调试这个问题? CVS提供了什么输出? – Mort

+0

我现在改变了我的方法。而不是直接使用python脚本来执行命令行界面。我创建了一个批处理文件,它具有从CVS存储库中检索文件的所有命令,并且我正试图从我的python脚本中调用这个bat文件。为我工作! – user1681102