【问题标题】:Usage of subprocess.Popen with CVS repository?subprocess.Popen 与 CVS 存储库的使用?
【发布时间】:2014-06-12 14:00:30
【问题描述】:

我正在编写一个 python 脚本来向 CVS 存储库添加一些功能。我正在尝试使用 subprocess.Popen 模块通过 windows 命令行运行 cvs checkout,例如

subprocess.Popen('cvs -Q co -r %tag% %directory%')

其中标签和目录只是占位符(脚本接受用户输入)。我设置了 CVSROOT,但无论出于何种原因,我都无法让脚本检查所需的 cvs 模块。直接在命令行中运行相同的命令(在引号内)按预期工作,检查目录。

【问题讨论】:

    标签: python shell subprocess cvs


    【解决方案1】:

    参数不会作为字符串传递给 subprocess.Popen。您需要在列表中传递命令和参数

    subprocess.Popen(['cvs', '-Q', 'co', '-r', '%tag%', '%directory%'])
    

    或者

    subprocess.Popen(shlex.split('cvs -Q co -r %tag% %directory%'))
    

    【讨论】:

      【解决方案2】:

      好吧,如果你想要与 shell 中相同的行为,你应该这样说:

      subprocess.Popen('cvs -Q co -r %tag% %directory%', shell=True)
      

      但一般情况下最好这样做

      subprocess.Popen(['cvs', '-Q', 'co', '-r', tag, directory])
      

      改为。

      【讨论】:

      • 第二种方法可以防止出现问题,例如,如果目录名称中有空格(或者更糟的是,像 > ; | 这样的字符)。在 Windows 上,Popen 实现将引用这些内容;在 linux 上,shell 被绕过,所以这不是问题。
      • 我都试过了,还是没有骰子。第一种方法设置 shell=True 只是返回 并且没有打开命令提示符。将命令列为字符串的第二种方法会短暂显示命令提示符,但它会立即关闭,我无法阅读文本(即,如果有错误消息)并且它没有检出模块。这与我之前尝试的结果相同。
      • 你能打开 cmd.exe 并在那里输入命令,然后运行吗?
      • @greggo 是的,当我直接在 cmd 提示符下运行该命令时,该命令有效。模块被检出。
      • 尝试同时添加选项 stdout = logfile、stderr = logfile,其中 'logfile' 是您已打开用于写入的文件。该文件中可能会出现一些有用的内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多