Как запустить сценарий Python портативно, не указывая его полный путь

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

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

cd ~ 

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

 python run.py 

вместо

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

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

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

РЕДАКТИРОВАТЬ

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

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

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

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

  • это все еще не имеет большого смысла, поскольку в Windows используется cmd.exe , а POSIX использует sh , поэтому каждый может запускать команды с другим синтаксисом. Итак, допустим, что наиболее переносимой возможностью было бы подавать один и тот же вход для sh и cmd.exe , запуская скрипт python в обоих случаях. В этом случае вы можете запустить ту же команду из system функции ANSI C, которая использует 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.py бы run.py ; было бы лучше иметь возможность писать только run

4 Solutions collect form web for “Как запустить сценарий Python портативно, не указывая его полный путь”

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

 python -m run 

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

-m module-name
Ищет sys.path для именованного модуля и запускает соответствующий .py файл как скрипт.

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

 #!/usr/bin/env python 

к началу файла и сделать его исполняемым с помощью chmod +x .

Ответ после пояснения

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

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

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

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

На окнах:

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

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

  1. Сделать исполняемый файл python (как указано выше в «alberge»)
  2. Создайте каталог и поместите этот каталог в свою переменную PATH
  3. В этом каталоге создайте ссылки на свои скрипты python
  • Линейные дроссели на 0x1A
  • Большой файл не сбрасывается на диск сразу после вызова close ()?
  • Создайте окно tkinter python без кнопки X (закрыть)
  • Получите предварительный просмотр JPEG PDF в Windows?
  • Как включить chromedriver с pyinstaller?
  • Удаление кнопок минимизации / увеличения в Tkinter
  • Python / Tkinter: мышь перетаскивает окно без границ, например. overridedirect (1)
  • Анаконда Python 32-бит пытается загрузить 64-битные библиотеки Anaconda
  • pickle.load () повышение EOFError в Windows
  • Как запустить установленный Python-модуль в Windows?
  • Python Popen - env ​​- ffmpeg crash
  •  
    Interesting Posts for Van-Lav

    Как скопировать весь каталог файлов в существующий каталог с помощью Python?

    Как программно изменить объем в Ubuntu

    Домашний пивоваренный врач предупреждает о /Library/Frameworks/Python.framework, даже с установленным Python пива

    Как проверить на Python, из которого производятся методы класса?

    Python SocketServer: отправка нескольким клиентам?

    Понимание странного логического поведения индексации 2d-массива в numpy

    Как протестировать тайм-ауты прокси-сервера nginx

    API групп Google добавить участника

    GetModuleHandleA не получает модули, не используемые python.exe при подключении к другому процессу

    Зачем использовать classmethod вместо staticmethod?

    Управление rsync с помощью Python?

    Ошибка синтаксиса при использовании «с открытым» в Python (новичок в python)

    Как группировать несколько столбцов в pandas DataFrame в расчете pct_change

    странные результаты при новинке с атласом и openblas

    Производительность: Python pandas DataFrame.to_csv добавляется постепенно медленнее

    Python - лучший язык программирования в мире.