Я задавался вопросом, как сделать сценарий Python портативным и к Linux и к окнам?
Одной проблемой, которую я вижу, является хижина. Как записать хижину так, чтобы скрипт мог быть запущен на обоих окнах и Linux?
Есть ли другие проблемы помимо хижины, которую я должен знать?
Решение - то же для сценария жемчуга?
Спасибо и всего наилучшего!
Windows просто проигнорирует shebang (который, в конце концов, является комментарием); в Windows вам нужно связать расширение .py
с исполняемым файлом Python в реестре, но вы вполне можете оставить shebang включенным, он будет совершенно безобидным.
Есть много кусочков и деталей, специфичных для конкретной платформы (многие существуют только на Unix, msvcrt
только на Windows), так что если вы хотите быть переносимым, вам следует воздержаться от них; некоторые тонко отличаются (например, детальное точное поведение subprocess.Popen
или mmap
) - это все довольно сложные вещи, и документация поможет вам в этом. Если вы выполняете (через subprocess
или иным образом) внешние команды, вам лучше убедиться, что они существуют на обеих платформах, конечно, или проверить, на какой платформе вы находитесь, и использовать разные внешние команды в каждом случае.
Не забывайте всегда использовать /
, а не \
, как разделитель путей (прямая косая черта работает на обеих платформах, обратная косая черта - только для windows), и тщательно проверяйте, является ли каждый открываемый вами файл бинарным или текстовым.
Думаю, это все...
Убедитесь, что вы не обрабатываете файлы и каталоги как строки, а просто соедините их с косой чертой между ними. Perl:
$path = File::Spec->catfile("dir1", "dir2", "file")
Помните, что в Windows есть тома:
($volume, $path, $file) = File::Spec->splitpath($full_path);
@directories = File::Spec->splitdir($path);
При запуске других программ старайтесь избегать использования оболочки. В Perl, когда вы запускаете команду с функцией system
, вы можете легко ошибиться с помощью:
$full_command = 'C:\Documents and Settings/program.exe "arg1" arg2'; # spaces alert!
system($full_command);
Вместо этого вы можете запустить систему со списком в качестве аргумента: исполняемый файл и аргументы являются отдельными строками . В этом случае оболочка не участвует, и у вас не возникает проблем с экранированием оболочки или пробелами в именах файлов.
system('C:\Documents and Settings/program.exe', 'arg1', 'arg2');
В руководстве perlport задокументировано множество проблем с переносимостью.
Строка shebang будет интерпретирована Perl или Python как комментарий. Единственное, что придает ей особое значение, - это оболочка UNIX/Linux; в Windows она игнорируется. Windows знает, какой интерпретатор использовать для запуска файла, через ассоциации файлов в реестре, а это совсем другой механизм.
Я не знаю достаточно, чтобы комментировать подходы Python к этой проблеме, поэтому не буду.
Большинство вещей в Perl просто работают. Есть несколько ошибок, которых легко избежать.
Вот несколько вещей, с которыми я столкнулся за годы работы с Win32 Perl:
open
. Форма с двумя аргументами может иметь проблемы с пробелами в путях. (В любом случае вы уже должны это делать.) использовать предупреждения;
будет работать, но на самом деле не сработает. select
работает только с настоящими сокетами под Windows.Вы не можете использовать его ни на какой другой ручке. File :: Spec
для управления путями к файлам. CRLF
автоматически преобразуется в окончания строки LF
по мере чтения дескриптора. LF
изменяется на CRLF
при записи. Если вы хотите избежать этого, используйте binmode
на дескрипторе, чтобы предотвратить перевод. См. perlport для получения дополнительной информации об отдельных функциях.