Как запустить скрипт Python из оболочки C без указания всего пути?

3290
Djeezus

Я хотел бы запустить скрипт Python из оболочки Hamilton C без указания полного пути скрипта.

Первым делом я попытался добавить папку скриптов в переменную окружения PATH в Windows. Это сработало, но оболочка C не может просто автоматически выполнять файлы .py, поэтому я должен использовать «python» перед именем скрипта.

Теперь проблема в том, что, поскольку моя папка scripts не является путем Python, она не распознается исполняемым файлом Python. Так что это тоже не работает.

Я также попытался добавить свою папку в переменную окружения "PYTHONPATH" (которую мне пришлось создать), но это тоже не работает.

Есть ли способ, которым я могу запустить свой скрипт, просто вызвав его имя (myscript.py) или "python myscript.py"?

2
Есть ли какие-либо обновления в ответах ниже, или вы нашли какое-либо достойное одобрения или у вас все еще есть проблемы, которые вам нужно решить в соответствии с вашим вопросом? Pimp Juice IT 6 лет назад 0

3 ответа на вопрос

1
Nicole Hamilton

Я автор оболочки Гамильтон C . Похоже, вы используете Cygwin с моей оболочкой C и получаете следующую ошибку при попытке использовать python:

1 C% python csh(C:\cygwin64\bin\python line 1): Couldn't open 'symlink' as a redirected standard input. > in C:\cygwin64\bin\python < called from line 1 

Проблема в том, что команда Python Cygwin - это файл символьных ссылок только для Cygwin, а не фактический исполняемый файл. Они поддерживаются только Cygwin . (Возможно, вы заметили, что cmd.exe тоже не запустится.) Вот что в нем:

2 C% whereis python C:\cygwin64\bin\python 3 C% cat `!!` cat `whereis python` !<symlink>python2.7.exe 

Не имея возможности распознать его как что-либо еще, оболочка C пыталась интерпретировать его как сценарий, полагая, что распознает оператор перенаправления ввода-вывода!< оболочки C, но не может найти файл с именем, отсюда и сообщение об ошибке.symlink

Но, учитывая, что все, что делает этот файл - это перенаправляет вас к реальному исполняемому файлу, вы можете сделать то же самое с псевдонимом оболочки C, который вы можете сохранить в своем файле startup.csh :

4 C% alias python python2.7 5 C% python Python 2.7.10 (default, Jun 1 2015, 18:05:38) [GCC 4.9.2] on cygwin Type "help", "copyright", "credits" or "license" for more information. >>> quit() 6 C% cd desktop 7 C% cat MyScript.py print("Hello") 8 C% python MyScript.py Hello 

Если вы хотите запускать свои сценарии Python непосредственно из оболочки C без необходимости вводить команду python, оболочка C поддерживает общий #!синтаксис, который предписывает ей использовать интерпретатор python. Но обратите внимание, ему все еще нужно имя фактического исполняемого файла. Вот пример:

9 C% cat MyScript2.py #!python2.7 print("Hello") 10 C% MyScript2.py Hello 11 C% 
1
Pimp Juice IT

Запускать скрипты Python из командной строки Windows только с именем скрипта

Можно ли как-нибудь запустить мой скрипт, просто вызвав его имя (myscript.py) или «python myscript.py»?

Безусловно, вы можете сделать это в Windows без проблем. Я проверил это и подтвердил, что с Windows 10 он работает, как и ожидалось, выполнив следующие действия.


Настройка указателей ассоциации файлов Windows

Задайте полный явный путь к python.exe, как показано ниже # 3, для правильного значения в вашей системе.

  1. Откройте привилегированную командную строку [cmd.exe] с правами администратора.
  2. Введите ASSOC .py=PythonScriptи нажмитеEnter
  3. Введите FTYPE PythonScript="C:\Program Files\Python\python.exe" "%1" %*и нажмитеEnter
  4. Введите SET PATHEXT=.py;%PATHEXT%и нажмитеEnter

Подтвердите и протестируйте указатели ассоциации файлов Windows

Теперь из командной строки вы можете просто ввести полный путь к скрипту Python, а затем нажать Enter, и логика Python должна работать соответствующим образом.

При желании вы можете просто ввести полный путь без .pyрасширения файла. Вы также можете просто CDперейти в каталог, где находится скрипт python, а затем ввести имя скрипта (с расширением или без него) и нажать Enter, и python должен соответствующим образом запустить логику скрипта.

Примеры из CMD (пост выше изменений)

  • "C:\ScriptPath\scriptname.py" и нажмите Enter
  • "C:\ScriptPath\scriptname" и нажмите Enter
  • CD /D "C:\ScriptPath\scriptname.py" и нажмите Enter
  • CD /D "C:\ScriptPath\scriptname.py" и нажмите Enter

Выполнять только из оболочки с именем скрипта

Если вам действительно нужно запустить скрипт из командной строки, не сообщая оболочке полный явный путь к файлу скрипта python, то вам нужно добавить путь, где этот скрипт находится, к %PATH%переменной среды.

  1. Откройте привилегированную командную строку [cmd.exe] с правами администратора.
  2. Введите SET PATH=%PATH%;C:\Program Files\Pythonгде C:\Program Files\Pythonэто значение, где оно существует в вашей системе.

Теперь вы можете просто ввести имя скрипта с расширением файла или без него, не обращаясь CDк другому каталогу или явно указав полный путь к скрипту python.


Дополнительные ресурсы

  • Переменные среды Windows

  • FTYPE /?

    Displays or modifies file types used in file extension associations  FTYPE [fileType[=[openCommandString]]]  fileType Specifies the file type to examine or change openCommandString Specifies the open command to use when launching files of this type.  Type FTYPE without parameters to display the current file types that have open command strings defined. FTYPE is invoked with just a file type, it displays the current open command string for that file type. Specify nothing for the open command string and the FTYPE command will delete the open command string for the file type. Within an open command string %0 or %1 are substituted with the file name being launched through the assocation. %* gets all the parameters and %2 gets the 1st parameter, %3 the second, etc. %~n gets all the remaining parameters starting with the nth parameter, where n may be between 2 and 9, inclusive. For example:  ASSOC .pl=PerlScript FTYPE PerlScript=perl.exe %1 %*  would allow you to invoke a Perl script as follows:  script.pl 1 2 3  If you want to eliminate the need to type the extensions, then do the following:  set PATHEXT=.pl;%PATHEXT%  and the script could be invoked as follows:  script 1 2 3 
  • ASSOC /?

    Displays or modifies file extension associations  ASSOC [.ext[=[fileType]]]  .ext Specifies the file extension to associate the file type with fileType Specifies the file type to associate with the file extension  Type ASSOC without parameters to display the current file associations. If ASSOC is invoked with just a file extension, it displays the current file association for that file extension. Specify nothing for the file type and the command will delete the association for the file extension. 
0
didac

Допустим, у вас есть скрипт Python, вызываемый MyScript.pyиз заданного каталога:

print("Hello") 

Вы можете узнать, где находится Python в вашей системе:

$ which python /usr/bin/python

Добавив следующий shebang в начале MyScript.py, ваш скрипт легко найдет интерпретатор Python, и вы сможете выполнить его без предварительного вызова Python:

#!/usr/bin/python print("Hello") 

$ ./MyScript.py Hello

(В этот момент вы также можете удалить .pyрасширение.)

Если вы не находитесь в той же директории, в которой находится MyScript.py, вам нужно будет указать оболочке, где ее найти. Это можно сделать, добавив путь к переменной среды PATH следующим образом:

$ setenv PATH <path to my script>:$PATH 

или же

$ setenv PATH $PATH:<path to my script> 

Теперь MyScript.pyможно выполнить из любого места.

Если вы хотите сделать это постоянным, вы можете добавить эту строку в ваш .cshrc, .login или подобный файл.

Похоже, это относится в основном к Linux, но я на Windows, поэтому я не думаю, что это работает. Я уже добавил свою папку в переменную PATH, и она работает (имеется в виду, что я могу вызвать свой скрипт из другой папки). Проблема в том, что при вызове скрипта он не выполняется с интерпретатором python, а при вызове с интерпретатором python не удается найти скрипт. Djeezus 7 лет назад 0