2012-04-03 3 views
6

Есть ли переносимый способ запуска скрипта python из оболочки без написания полного пути?Как запустить сценарий Python портативно, не указывая его полный путь

Например, в Linux, я хотел бы некоторое время в моем домашнем каталоге

cd ~ 

, чтобы иметь возможность запускать питон скрипт run.py, который, скажем, ~/длинный/путь/к/запуска .py, но я хочу, чтобы запустить его, просто набрав

python run.py 

вместо

python ~/long/path/to/run.py 

Я хотел бы надеяться на какую-то себе который содержит несколько каталогов, подобно переменной PATH, так что python run.py запускает первый run.py, который встречается в одном из каталогов.

Я рассмотрел возможность запуска run.py в исполняемый файл и добавление его каталога в системную переменную PATH, но не смог найти портативный способ создания исполняемого скрипта python.

EDIT

Через год после того, как с просьбой, я немного меньше нуб, и я вижу, что мой вопрос был не очень понятно, и не имеет особого смысла, так что после вопроса upvote я буду прояснить некоторые вещи.

1) Портативный.

Когда я спросил об этом, я сказал портативный. Однако какие переносные средства в этом случае не ясны, и я не уделял этому много внимания.

  • платформ: должны работать на POSIX (Linux, MacOS и т.д.) и Windows,

  • это до сих пор не имеет особого смысла, так как окна использует cmd.exe и POSIX использует sh, поэтому каждый из них мог выполните команды с другим синтаксисом. Итак, допустим, что наиболее переносимой возможностью было бы подавать один и тот же ввод как sh, так и cmd.exe, запуская скрипт python в обоих случаях. В этом случае вы можете запустить ту же команду из функции ANSI C system, которая использует sh на POSIX и cmd в Windows. ANSI C является одной из немногих вещей, которая характерна для Windows и POSIX. В этом случае вопрос имеет смысл.

2) Исполняемые

Следующая фраза turning run.py into an executable, не очень понятно. Тем самым я говорил о стратегии Linux chmod +x run.py, добавлял shebang #!/usr/bin/env python и добавлял его каталог в систему, добавляя переменную окружения PATH ~/long/path/to /. Но тогда это не будет работать для окон, потому что окна не поддерживают свойство метаданных исполняемого файла, такое как Linux, и потому что/usr/bin/env не обязательно существует в Windows.

3) Расширение

Наконец, в моей голове, я надеялся на решение, которое не определяет, какой файл запуска есть, так что если когда-нибудь мы решили сделать это, скажем, файл Perl, нет интерфейсы будут меняться.

Таким образом, написание run.py было бы плохо, потому что это указывало бы тип файла; было бы лучше, чтобы иметь возможность написать только run

ответ

14

Если каталог, содержащий run.py находится на пути поиска модулей (например, PYTHONPATH переменной окружения), вы должны быть в состоянии выполнить это следующим образом:

python -m run 

Вот документация на -m командной строки опция:

-mmodule-name
Поисковые sys.path для именованный модуль и запускает соответствующий файл .py как скрипт.

+0

Спасибо FJ, это именно то, что я искал, я чувствую, что это имеет два преимущества перед «#!» подход: 2 –

+0

(конкретный Извините, половина закончил комментарий) ... Спасибо F.J, это то, что я искал, я чувствую, что у него есть два преимущества перед «#!» подход: 1) не загромождение скриптов 2) не загромождение глобальной переменной PATH и использование более конкретного PYTHONPATH. Недостатком, конечно же, является необходимость набирать «python -m» все время, что занимает место и что еще хуже, может означать переписывание кода, если вы когда-нибудь решите преобразовать скрипты python в, скажем, bash-скрипты. –

+0

Я попытался выполнить python -m, но это не сработало ... Я уверен, что run.py находится в PYTHONPATH, так как я могу импортировать его, и он показывает, когда я импортирую sys; print sys.path ... я что-то не хватает? –

4

Вы можете сделать исполняемый питон скрипт, добавив

#!/usr/bin/env python 

в начале файла, и сделать его исполняемым с chmod +x.

+0

Спасибо alberge, я не был уверен, что это работает в Windows, но кажется, что #!/Usr/bin/env python будет рассматриваться как комментарий, а установка python автоматически связывает запущенные .py-файлы с интерпретатором python. Это особенно удобно, если вы поместите .py в свой EXTPATH, чтобы вы могли запускать файлы python, просто набрав «run» вместо «run.py», а это значит, что если вы когда-нибудь решите преобразовать свои скрипты python, скажем, Perl, вам не нужно будет переписывать вызовы сценария. Было бы здорово, если бы был простой способ запускать скрипты в Linux без написания расширения и без добавления #! ... –

+0

Это отлично работает с virtualenv – Henrik

0
  1. Сделать питон исполняемый файл (как «alberge» было указано выше)
  2. Создать директорию и поместить этот каталог в свой PATH переменной
  3. В этом каталоге, создавать ссылки на ваши питона сценариев
1

Ответ после осветления редактирования

Я предпочитаю следующее подход к предложению, приведенному в [F.J. потому что он не требует от пользователей указания типа файла. Обратите внимание, что это не было указано в исходном вопросе, поэтому его ответ на исходный вопрос был правильным.

Позволяет вызвать файл pytest.py во избежание конфликтов с возможной существующей программой run.

На POSIX (MacOS, Linux) делать то, что сказал @Petr, который основан на том, что @alberge сказал:

  • chmod +x
  • добавить притон #!/usr/bin/env python
  • создать каталог и добавить его в путь , Обычные места на Linux являются: ~/bin/для одного пользователя, /usr/local/bin/ для всех пользователей
  • символических (cp -s) файл под PATH с базовым именем pytest вместо pytest.py

На окнах:

  • создать репер и добавить его в PATH. AFAIK, для этого нет обычного места, так почему бы не C:\bin\ и ~\bin\?
  • добавить .PY к переменной в PATHEXT среде, чтобы операционная система будет распознавать файлы с расширением питона в качестве запускаемых файлов без необходимости введите расширение
  • ассоциировать питона файлы с python.exe интерпретатор (Проводник Windows> щелкните правой кнопкой мыши> проверить «Всегда использовать выбранной программы "). В установщике python есть опция, которая делает это за вас.
  • символическая pytestс расширением в директорию под PATH (с помощью Link Shell Extension из проводника Windows или mklink name dest из ЦМД)

Теперь system("pytest"); должны работать в обеих системах (sh под Linux, cmd под Windows)

Смежные вопросы