как сделать Python или сценарий жемчуга портативными и к Linux и к окнам?

Я задавался вопросом, как сделать сценарий Python портативным и к Linux и к окнам?

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

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

Решение - то же для сценария жемчуга?

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

11
задан Tim 11 June 2010 в 04:53
поделиться

4 ответа

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

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

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

Думаю, это все...

14
ответ дан 3 December 2019 в 04:12
поделиться

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

7
ответ дан 3 December 2019 в 04:12
поделиться

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

2
ответ дан 3 December 2019 в 04:12
поделиться

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

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

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

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

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

2
ответ дан 3 December 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: