Как запустить скрипт Python как исполняемый и сохранить доступ к окружающим его файлам? - PullRequest
0 голосов
/ 24 января 2019

У меня есть программа на Python «Alfred.py», которую я хочу запустить, щелкнув значок или напечатав «Alfred» в терминале. Он подключен к файлу базы данных и извлекает файлы Excel по запросу. Когда я пытаюсь запустить его, нажимая, вот что я получаю:

mcaay:~ mcaay$ /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/Alfred.desktop ; exit;
/Users/mcaay/Documents/Moje Dokumenty/MANTA/Alfred/Alfred.desktop: line 1: [Desktop: command not found
Traceback (most recent call last):
  File "/Users/mcaay/Documents/Moje Dokumenty/MANTA/Alfred/Alfred.py", line 59, in <module>
    AND Usterka IS NOT NULL;""")
sqlite3.OperationalError: no such table: repairs
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Process completed]

Эта строка:

sqlite3.OperationalError: no such table: repairs

означает, что Alfred.py не нашел файл .db, создал его, но он был пуст, поэтому не было таблицы с именем "repair". Этот файл .db находится в том же каталоге, что и Alfred.py.

Что я делал до сих пор:

  • добавлено "#! / Usr / bin / env python3" в качестве 1-й строки Alfred.py
  • набрал "chmod + x / Users / mcaay / Documents / Moje \ Документы / MANTA / Alfred / Alfred.py" в терминале, чтобы сделать его исполняемым
  • добавлено "export PATH = $ PATH: / Users / mcaay / Documents / Moje \ Dokumenty / MANTA / Alfred /" в мой .bash_profile, чтобы сделать Alfred.py доступным из любого места в терминале
  • создан файл Alfred.desktop для интерактивного значка:
[Desktop Entry]
Name=Alfred
Exec=python3 /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/Alfred.py
Terminal=true
Type=Application
  • сделал Alfred.desktop исполняемым, набрав в терминале «chmod + x / Users / mcaay / Documents / Moje \ Документы / MANTA / Alfred / Alfred.desktop»

Когда я набираю в терминале "Alfred.py", я получаю:

mcaay:~ mcaay$ Alfred.py
Traceback (most recent call last):
  File "/Users/mcaay/Documents/Moje Dokumenty/MANTA/Alfred/Alfred.py", line 59, in <module>
    AND Usterka IS NOT NULL;""")
sqlite3.OperationalError: no such table: repairs

Так же, как и при нажатии «Alfred.desktop». Если я наберу просто «Альфред», я получу:

mcaay:~ mcaay$ Alfred
-bash: Alfred: command not found

Я хочу, чтобы просто набрал «Альфред», и я хочу, чтобы он правильно видел базу данных и другие файлы, или, в противном случае, если щелчок по значку будет работать правильно, это тоже приемлемо. Мой Гуге-Фу подвел меня здесь. Что делать?

P.S. Я заметил, что файл базы данных создается в моем домашнем каталоге ("/ Users / mcaay"), как будто Alfred.py был извлечен из исходного места назначения в какое-то временное место назначения и выполнено там (другие файлы не были извлечены, поэтому программа потерпела крах).

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Я думаю, что он просто ищет файл .db в каталоге, в котором он был выполнен. Вам следует либо определить файл .db с абсолютным путем, либо получить доступ к файлу .db в том же каталоге скрипта, который вы можете получить. с помощью: os.path.dirname(sys.argv[0])

0 голосов
/ 25 января 2019

Хорошо, так что после хорошего сна я наконец прочитал то, что прочитал, и получил ответ.Все, что я делал раньше, не нужно и может быть отброшено.

Мое решение (учтите, что я использую macOS Mojave atm):

  1. В домашнем каталоге я создал файл с именем .start_alfred.sh.Это сценарий оболочки, который будет вызывать вызываемую команду в терминале, чтобы перейти в мой указанный каталог, а затем запустить скрипт Python.
  2. Внутри я написал это:
#!/bin/bash

function Alfred() {
    cd /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred
    python3 Alfred.py
}

Имя этой функции (Alfred) - это то, что будет вызывать команды оболочки, включенные в нее.Он в основном делает то, что вы обычно делаете в терминале для запуска программы.

В моем .bash_profile я добавил source ~/.start_Alfred.sh в конце, поэтому каждый раз, когда я открываю терминал, все, что находится в .start_Alfred.sh, становится доступным немедленно.

Вот и все :) Может быть, не самый чистый, но супер легкий и достаточно хороший для того, что мне нужно.Ответы Tanktalus и asafpr помогли мне найти это решение.

Вариант использования:

mcaay:~ mcaay$ Alfred

Co jest?
>>> thx
np

mcaay:Alfred mcaay$ 

Thx - команда завершения скрипта Python.

0 голосов
/ 24 января 2019

Когда вы указываете SQLite, где найти базу данных, вы используете относительный путь, но этот относительный путь относительно текущего рабочего каталога .Вам нужно либо изменить каталог внутри вашего скрипта, либо указать SQLite полный путь к вашей базе данных.В любом случае, это требует логики для определения того, где находится ваш скрипт, или вы можете поместить БД в другой известный путь (например, ~/.config/alfred).Лично я предпочитаю всегда создавать полные пути и по возможности избегать относительных путей (и каталога изменений), но chdir к вашему пути к скрипту также должен быть относительно безопасным и может потребовать меньше изменений на этом этапе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...