Cygwin中路径的正确使用:`python c:\somefile.py`和`python /cygdrive/c/somefile.py`之间的区别。

9
我正在使用Windows + Cygwin系统上的Django 1.5和Python 2.7。在bash shell中运行以下命令会出现错误。
$ python /cygdrive/c/Python27/Lib/site-packages/django/bin/django-admin.py

错误:

C:\Python27\python.exe: can't open file '/cygdrive/c/Python27/Lib/site-packages/django/bin/django-admin.py': [Errno 2] No such file or directory

然而这是如何工作的。
$ python c:/Python27/Lib/site-packages/django/bin/django-admin.py

我看到很多关于django-admin.py错误的类似问题,但没有一个是特别针对这个的。

那么,在Cygwin的bash shell上,python c:\somefile.pypython /cygdrive/c/somefile.py之间有什么区别呢?

3个回答

21

如其他人所指出的,问题的部分原因在于您正在从Cygwin调用Windows Python。这是一种奇怪的做法,因为您可能会遇到像这样的奇怪行为,但是如果小心使用,它是可行的。

当您从Cygwin调用Python(无论是Cygwin Python还是Windows Python),您传递的路径将按原样传递给Python进行处理。这意味着Python必须知道如何处理这种路径。例如,如果您传递以下内容:

  • C:\path\to\script.py - Windows Python知道如何处理此类路径,而Cygwin Python可能会感到困惑。尽管如此,如果您在Cygwin shell中键入此内容,那些反斜杠可能会被解释为转义字符,并且它们是否被解释为转义字符取决于一些相对复杂的规则。如果您只是在Cygwin中玩耍,最好避免这样做。

  • 'C:\path\to\script.py' - 这些引号将被Cygwin的bash shell剥离,同时停止反斜杠被解释为转义字符,因此这将很好地为从Cygwin调用Windows Python工作。但是,在从Windows命令行或类似程序运行时,将会出现问题,因为Windows不处理单引号。

  • /cygdrive/c/path/to/script.py - 这是任何Cygwin程序(例如Cygwin Python)的视角下的路径。它对于Cygwin Python完美地工作,但对于Windows Python根本不起作用。

  • C:/path/to/script.py - 不太知名的是,在Windows路径中的反斜杠可以替换为正斜杠,任何表现良好的Windows程序都应该可以很好地处理它们:它们被Windows明确允许。特别是,Windows Python绝对没有任何问题,也不会尝试使用正斜杠进行智能处理。因此,您可以在任何需要调用Windows Python的地方使用这种类型的路径。

  • $(cygpath -w /cygdrive/c/path/to/script.py) - cygpath 是一个Cygwin实用程序,用于在不同的路径样式之间转换;使用 -w 选项调用时,它将Cygwin路径转换为Windows路径。 $(...) 表示Cygwin的bash shell应该用运行命令的结果替换文本,因此如果将其作为参数提供给从Cygwin bash shell调用的Windows Python,则Windows Python将收到可以使用的Windows路径。

  • path/to/script.py - 这是一个相对路径,因此您需要从适当的目录中调用它。这是能够兼容Cygwin和Windows Python,从Cygwin shell和Windows命令行都可以调用的第一个版本。

  • 如您所见,路径很复杂,特别是当您同时使用Cygwin和Windows工具时。

    一般来说,最安全的方法是尽可能只使用其中一种(例如只从Cygwin shell使用Cygwin Python,只从Windows命令行使用Windows Python)。如果不可能,下一个最好的方法是无论何时你从Cygwin或者反过来调用Windows程序均要使用cygpath - 运行 cygpath -w /cygdrive/c/Windows 将会返回 c:\windows;运行 cygpath 'c:\Windows' 将会返回 /cygdrive/c/Windows


    很好的解释。你能给我指一下在Windows/Cygwin/Bash上关于引号、斜杠和反斜杠行为的简明参考吗? - user
    很遗憾,没有简明参考。Cygwin的cygpath文档是我能找到的最有用的。此外,还有一个关于Windows中正斜杠的不错的Super User问题 - me_and
    太棒了!我不知道 C:/path/to/script.py 会起作用。 - Muposat

    3

    看起来您在 C: 安装了 Python,而不是像 /usr/bin/python 这样的位置。我猜您从 python.org 安装了 Windows 版本的 Python,而不是 Cygwin Python 包。在这种情况下,Python 可执行文件没有使用 Cygwin(它正在本地运行),并且期望使用 Windows 格式的路径名。

    此外,您的 Django 似乎安装在 Windows 的 Python 中。Cygwin 可能完全不参与。


    你说得对,我使用的是Python和Django的Windows版本。但如果问题出在bash/Cygwin的使用上,为什么第二个路径格式能够正常工作呢? - user
    1
    @buffer:鲜为人知的事实是:在Windows中,斜杠路径和反斜杠路径一样有效。后者是默认的,但两者都可以使用。您看到斜杠起作用,是因为Windows Python正在期望并接收有效的Windows路径。 - me_and

    1

    嗯,什么都不应该有变化:

    hgs15624@ESCLT0116 ~
    $ python /cygdrive/c/test.py
    Hello
    
    hgs15624@ESCLT0116 ~
    $ python c:/test.py 
    Hello
    

    我想你已经在寻找奇怪的权限。
    编辑:下面只是指问题中的一个打字错误。
    错误信息如下:
    /cygdrive/c/Python27/Lib/sitepackages/django/bin/django-admin.py
    

    你在 site-packages 中漏掉了连字符吗?


    粘贴错误消息时出现了奇怪的错误。不是这个问题,我正在编辑问题来纠正它。正如您所看到的,命令是正确的。 - user
    你给的例子在我的情况下不起作用。尽管文件具有读取/执行权限,但我仍然收到相同的错误。 - user

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接