9

Вопрос по posix, shell, windows, python – undefined

Существует ли переносимый способ запуска скрипта 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.

EDIT

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

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

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

  • the platforms: should work on POSIX (Linux, MacOS, etc.) and Windows

  • this still does not make much sense since windows uses cmd.exe, and POSIX uses sh, so each one could run the commands with a different syntax. So let's say that the most portable thing possible would be to feed the same input to both sh and cmd.exe, running the python script in both cases. In this case, you could run the same command from an ANSI C system function, which uses sh on POSIX and cmd on Windows. ANSI C being one of the few things that is common to Windows and POSIX, the question makes some sense in that case.

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

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

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

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

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

  • Это прекрасно работает с virtualenv

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

  • @ciro Вы видите сообщение об ошибке? Это просто "Нет модуля с именем run" или что-то другое?

    от
  • Спасибо F.J, это именно то, что я искал, я чувствую, что у него есть два преимущества по сравнению с "#!" подход: 2

  • Принят, потому что он отвечает на первоначальный вопрос, включая требование переносимости (которое изначально было недостаточно подчеркнуто)

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

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

  • 0

    Code:

    Make python file executable (as "alberge" stated above) Create some directory and put this directory into your PATH variable In this directory, create links to your python scripts

  • 15

    Если каталог, содержащий python -m run

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

    python -m run
    

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

    -m module-name
    Searches sys.path for the named module and runs the corresponding .py file as a script.

  • 5

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

    #!/usr/bin/env python
    

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

  • 2

    Answer after the clarification edit

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

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

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

    chmod +x add shebang #!/usr/bin/env python create a directory and add it to path. Usual locations on Linux are: ~/bin/ for a single user, /usr/local/bin/ for all users symlink (cp -s) the file under your PATH with basename pytest instead of pytest.py

    На окнах:

    create a dir and add it to PATH. AFAIK, there is no conventional place for that, so why not C:\bin\ and ~\bin\? add .PY to the PATHEXT environment variable so that Windows will recognize files with python extension as runnable files without requiring you to type the extension associate python files with the python.exe interpreter (Windows Explorer > right click > check "Always use the selected program"). There is an option on the python installer that does this for you. symlink pytest with extension into the dir under PATH (using Link Shell Extension from Windows Explorer or mklink name dest from cmd )

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