На работе мне приходится иметь дело с довольно случайными комбинациями Windows без Cygiwn, Cygwin с не-Cygwin Python, Cygwin с Cygwin Python и Unix. Я не нашел способа справиться с этим, чем я особенно горжусь, но наименее ненавистный подход, который я нашел до сих пор, - это всегда использовать то, что Cygwin называет «смешанным стилем» пути в Windows. Это путь в стиле Windows, но с косой чертой вместо обратной. Например, c: /foo/bar.txt. Он также избегает многих ошибок, таких как оболочки Cygwin bash, которые видят «\» как побег. К сожалению, это означает, что вам не хватает многих встроенных в Python утилит для манипулирования путями и трудных действий.
У меня нет доступа к машине с Python и Cygwin на этом банкомате, поэтому я не могу проверить приведенные ниже фрагменты кода. Я прошу прощения за любые ошибки ...
#Combine a path
path = '/'.join([ 'c:', 'foo', 'bar'])
#Split it back apart
pieces = path.split('/')
Если сомневаетесь, попробуйте вызвать Cygwin's cygpath. В Cygwin появляется много странных крайних случаев, например, тот факт, что / cygdrive / d / == d: \ и все же /cygdrive/d/../../ == c: \ cygwin (или где бы то ни было Cygwin установлен). Также помните, что обратные слэши используются в качестве escape-символов в путях стиля Unix, таких как / cygdrive / c / Documents \ и \ Settings. Cygpath делает удивительную работу, заботясь об этом, и если он недоступен, то обычно безопасно предположить, что ваши странные крайние случаи не существуют.
<pre></p>
<pre><code>import sys
import subprocess
#Buncha code here ...
#We got somepath from somewhere, and don't know what format it's in.
try:
somepath = subprocess.check_output(['cygpath', '-m', somepath])
except subprocess.CalledProcessError:
#Cheap attempt at coping with the possibility that we're in Windows, but cygpath isn't available.
if sys.platform.startswith('win32'):
mypath = somepath.replace('\\', '/')
else:
mypath = somepath
#Now we can assume somepath is using forward slashes for delimiters.
Некоторые команды Windows сбиваются с толку, если вы передаете им путь в стиле Windows, а некоторые команды Cygwin сбиваются с толку, если вы передаете путь Windows или смешанный стиль. Например, rsync может запутаться в «c: /foo/bar.txt», потому что похоже, что вы пытаетесь указать «/foo/bar.txt» на удаленном компьютере с именем «c». Когда вы вызываете одну из этих привередливых программ для Windows или Cygwin, используйте cygpath, чтобы сделать ее счастливой. Если вы вызываете привередливую программу для Windows, а cygpath недоступен, попробуйте подход «winpath = mypath.replace ('/', '\')" из гетто. Я думаю, что это может закончиться неудачей, если вы конвертируете путь в стиле Unix и у вас нет Cygwin, но, надеюсь, если у вас нет Cygwin, у вас нет путей в стиле Unix для Windows, чтобы начать с ...