无法使用Python

时间:2015-10-24 15:45:41

标签: python git

我正在尝试从git存储库获取该文件的特定版本。在包含repo的本地副本的文件夹中,我正在执行以下命令(使用Python脚本):

subprocess.call("C:\Program Files\Git\bin\git.exe show 34f97c9 folder\file.py > D:\file.py")

可悲的是,我得到的是:

fatal: >: no such path in the working tree.
Use 'git <command> -- <path>...' to specify paths that do not exist locally.

当我在gitbash中直接尝试相同的命令时(显然没有git补丁)它可以正常工作。

我可以请你咨询一下吗?

1 个答案:

答案 0 :(得分:0)

您的subprocess.call调用有几个错误:

  • 默认值为shell=False,这意味着该命令不会传递给shell,但>重定向是一个shell功能,不是内置于Python中的。例如,您可以使用subprocess.stdout=subprocess.PIPE捕获输出,或者您可以使用os级别例程创建文件并传递文件描述符,或打开流并传递其fileno;或者您当然可以设置shell=True
  • 使用shell=False,您应该自行解析参数,例如subprocess.call(["command", "arg1", "arg22"])subprocess.call("command arg1 arg2".split())。当然,对于shell=True,没有必要这样做,因为shell会这样做。 (我认为带有单个字符串的表单无论如何都适用于Windows,否则你会得到一个不同的错误,当然C:...在Unix / Linux上不能正常工作,所以也许这可以被忽略。)
  • 通常,字符串文字中的反斜杠是转义符。您在示例中显示的字符串文字包括退格和两个换页符:

    >>> print("C:\Program Files\Git\bin\git.exe show 34f97c9 folder\file.py > D:\file.py"")
    C:\Program Files\Giin\git.exe show 34f97c9 folder
                                                     ile.py > D:
                                                                ile.py
    >>> 
    

    你可能想要一个原始字符串,或者你可以将所有反斜杠加倍。

同时,你的git命令是有效的,但可能并不意味着你的意思:

git show revspec path1 [... pathN]

表示“为给定的revspec显示diff 1 ,但仅显示影响给定路径的更改”。如果要从特定树或提交中提取特定文件(“blob”),则语法为:

git show revspec:path

(注意修订说明符和路径之间的字面冒号:

1 如果指定的修订是普通提交,则这是常规差异;如果指定的修订是合并,则这是一个组合差异。