Как сделать Python или Perl-скрипт переносимым для Linux и Windows? - PullRequest
11 голосов
/ 11 июня 2010

Мне было интересно, как сделать скрипт на Python переносимым как на Linux, так и на Windows?

Одна проблема, которую я вижу, это Шебанг.Как написать shebang, чтобы скрипт мог запускаться как на Windows, так и на Linux?

Есть ли другие проблемы, кроме shebang, которые я должен знать?

То же самое решение для сценария perl?

Спасибо и всего наилучшего!

Ответы [ 4 ]

14 голосов
/ 11 июня 2010

Windows просто проигнорирует шебанг (который, в конце концов, является комментарием); в Windows вам нужно связать расширение .py с исполняемым файлом Python в реестре, но вы вполне можете оставить шебанг включенным, там он будет совершенно безобидным.

Есть много фрагментов, которые зависят от платформы (многие существуют только в Unix, msvcrt только в Windows), поэтому, если вы хотите быть переносимым, вы должны воздерживаться от них; некоторые немного отличаются (например, подробное точное поведение subprocess.Popen или mmap) - все это довольно продвинутые вещи, и документы помогут вам в этом. Если вы выполняете (через subprocess или иным образом) внешние команды, вам, конечно, лучше убедиться, что они существуют на обеих платформах, или проверить, на какой платформе вы находитесь, и использовать разные внешние команды в каждом случае.

Не забывайте всегда использовать /, , а не \, в качестве разделителя пути (прямая косая черта работает на обеих платформах, обратная косая черта только для окон), и будьте внимательны при выборе каждого файла Открываю двоичный или текстовый.

Я думаю, вот и все ...

7 голосов
/ 11 июня 2010

Убедитесь, что вы не обрабатываете файлы и каталоги как строки, а просто объединяете их с косой чертой между ними. 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 описано несколько штук переносимости.

2 голосов
/ 11 июня 2010

Я не знаю достаточно, чтобы комментировать подходы Python к этой проблеме, поэтому я не буду.

Большинство вещей в Perl будут просто работать.Есть несколько ошибок, которых легко избежать.

Вот несколько вещей, с которыми я столкнулся за годы работы с Win32 Perl:

  • Использовать 3 аргументаформа open.Форма с двумя аргументами может иметь проблемы с пробелами в путях.(Вы уже должны делать это в любом случае.)
  • Убедитесь, что дело обстоит правильно, когда вы используете модуль.use Warnings; будет работать, но на самом деле это не удастся.
  • select работает только на реальных сокетах под Windows.Вы не можете использовать его для любого другого дескриптора.
  • Используйте File::Spec для управления путями к файлам.
  • При открытии дескриптора файла CRLF будет автоматически преобразован в LF окончания строк при прочтении ручки.LF изменяется на CRLF при записи.Если вы хотите избежать этого, используйте binmode на дескрипторе для предотвращения перевода.
  • Если вам нужно передать аргументы через оболочку, заключите двойные кавычки вокруг каждого аргумента.Это предотвратит ошибки из-за пробелов в именах файлов.

См. perlport для получения дополнительной информации об отдельных функциях.

2 голосов
/ 11 июня 2010

Строка shebang будет интерпретироваться как комментарий Perl или Python.Единственное, что придает ему особое значение - это оболочка UNIX / Linux;это игнорируется в Windows.Windows знает, какой интерпретатор использовать для запуска файла, через ассоциации файлов в реестре, совершенно другой механизм.

...