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.py&有什么区别python /cygdrive/c/somefile.py

4

3 回答 3

20

正如其他人所指出的,这里的部分问题是您正在从 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 对它们没有任何问题,并且 Cygwin 的 bash shell 不会尝试巧妙地处理正斜杠。因此,您可以在任何调用 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)。如果这是不可能的,那么下一个最好的方法是cygpath在您从 Cygwin 调用 Windows 程序时使用,或者反过来 - 运行cygpath -w /cygdrive/c/Windows将给出c:\windows; 运行cygpath 'c:\Windows'将打印/cygdrive/c/Windows.

于 2013-03-11T23:36:06.390 回答
3

您似乎在 C: 中安装了 Python,而不是在 /usr/bin/python 或类似中。我猜你从 python.org 安装了 Python 的 Windows 端口,而不是 Cygwin python 包。在这种情况下,python 可执行文件没有使用 Cygwin(它正在运行本机),并且需要 Windows 格式的路径名。

此外,您的 Django 似乎已安装在您的 Windows Python 安装中。Cygwin 可能完全脱离了循环。

于 2013-03-11T13:28:17.287 回答
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吗?

于 2013-03-11T09:59:49.823 回答