使用绝对路径时,如何修复 Windows 8 Anaconda 在 cygwin 中“无法打开文件”错误?

使用绝对路径时,如何修复 Windows 8 Anaconda 在 cygwin 中“无法打开文件”错误?

我无法让 Anaconda 在 cygwin 上运行 python 脚本。

我的配置。Windows 8.1

$ echo $PATH
/usr/local/bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/WINDOWS/Syste
m32/WindowsPowerShell/v1.0:/cygdrive/c/Anaconda:/cygdrive/c/Anaconda/Scripts

启动没有脚本的 python 或 ipython 可以正常工作:

$ which python
/cygdrive/c/Anaconda/python

$ python
Python 2.7.6 |Anaconda 1.9.2 (64-bit)| (default, Nov 11 2013, 10:49:15) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

$ ipython
Python 2.7.6 |Anaconda 1.9.2 (64-bit)| (default, Nov 11 2013, 10:49:15) [MSC v.1500 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.

IPython 1.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]:
Do you really want to exit ([y]/n)? y

$ echo $PATH
/usr/local/bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/WINDOWS/Syste
m32/WindowsPowerShell/v1.0:/cygdrive/c/Anaconda:/cygdrive/c/Anaconda/Scripts

问题如下:

$ pwd
/home/John

$ ls -l /cygdrive/c/cygwin64/home/John/FooDir/helloworld.py
-rwxrwx--x+ 1 John None 47 Apr 25 16:42 /cygdrive/c/cygwin64/home/John/FooDir/helloworld.py

$ cat /home/John/FooDir/helloworld.py
#!/usr/bin/env python
print("Hello, World!")

$ python FooDir/helloworld.py
Hello, World!

$ python /home/John/FooDir/helloworld.py
C:\Anaconda\python.exe: can't open file '/home/John/FooDir/helloworld.py': [Errno 2] No such file or directory

$ python /cygdrive/c/cygwin64/home/John/FooDir/helloworld.py
C:\Anaconda\python.exe: can't open file '/cygdrive/c/cygwin64/home/John/FooDir/helloworld.py': [Errno 2] No such file or directory

$ python C:\\Cygwin64\\home\\John\\FooDir\\helloworld.py
Hello, World!

在我尝试使用绝对路径运行的任何脚本中都会发生这种情况。我怀疑该问题是由某种 cygpath 问题引起的,但不知道如何解决它...

当我使用 Cygwin 版本的 python 时,我没有遇到这个问题。

答案1

Cygwin 在 Windows 路径和 Cygwin 程序看到的路径之间执行映射。例如,您的 Cygwin HOME 目录/home/John是 Windows 目录C:\cygwin\home\John。将 Cygwin 文件系统的根目录放在 WindowsC:\cygwin目录中可避免 Cygwin 根目录名称与 Windows 根目录名称发生冲突。

Cygwin 还将 Windows 驱动器的根目录映射到 下的目录/cygdrive,因此 Windows 目录C:\D:\相当于 Cygwin 目录/cygdrive/c/cygdrive/d

Windows 程序无法理解 Cygwin 绝对路径,而 Cygwin 程序(通常)也无法理解 Windows 绝对路径。您可以使用命令在两种形式之间进行转换cygpathcygpath --help对其功能进行了相当完整的描述。

您的 Windows Python 程序只能理解 Windows 路径,因此要执行它python /home/John/FooDir/helloworld.py,请cygpath按如下方式使用:

python $(cygpath -w /home/John/FooDir/helloworld.py)

或者,根据您现在了解的有关 Cygwin 路径和 Windows 路径之间的映射,您可以像这样运行 Python 脚本:

python "C:\cygwin\home\John\FooDir\helloworld.py"

相关内容