我有一个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文件,创建了该文件,但它为空,因此没有称为“修复”的表。该.db文件与Alfred.py位于同一目录中。
到目前为止我所做的事情:
[Desktop Entry]
Name=Alfred
Exec=python3 /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/Alfred.py
Terminal=true
Type=Application
当我输入终端“ 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”相同。 如果我只输入“ Alfred”,则会得到:
mcaay:~ mcaay$ Alfred
-bash: Alfred: command not found
我只想键入“ Alfred”即可工作,并且希望它正确查看数据库和其他文件,或者如果单击该图标也可以正常工作,那也是可以接受的。我的Googe-Fu在这里失败了我。怎么办?
P.S。我注意到在我的主目录(“ / Users / mcaay”)中创建了一个数据库文件,好像Alfred.py是从原始目标位置拉到某个临时目标并在那里执行的(其他文件没有被拉出,因此程序崩溃了)。
答案 0 :(得分:0)
当您告诉SQLite在哪里找到数据库时,您使用的是相对路径,但是该相对路径是相对于当前工作目录的。您需要在脚本中更改目录或为SQLite提供数据库的完整路径。无论哪种方式,这都需要逻辑来查找脚本的位置,或者您可以将数据库放置在另一个众所周知的路径(例如~/.config/alfred
)中。就个人而言,我更喜欢始终构建完整路径,并尽可能避免使用相对路径(和更改目录)选项,但是脚本路径的chdir也应相对安全,并且此时可能需要较少的更改。 / p>
答案 1 :(得分:0)
我认为它只是在执行目录中寻找.db文件。您应该使用绝对路径定义.db或在可以获取脚本的同一目录中访问.db文件。使用:
os.path.dirname(sys.argv[0])
答案 2 :(得分:0)
好吧,经过一整夜的睡眠,我所读到的东西终于浮现在脑海中,我得到了答案。我之前所做的一切都是不必要的,可以将其丢弃。
我的解决方案(请记住,我正在使用macOS Mojave atm):
.start_alfred.sh
的文件。
这是一个Shell脚本,它将在终端中具有一个可调用的命令,以转到我指定的目录,然后运行python脚本。 #!/bin/bash
function Alfred() {
cd /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred
python3 Alfred.py
}
此函数的名称(Alfred
)将调用其中包含的shell命令。基本上,这是您在终端中通常会启动程序的工作。
.bash_profile
中,我在末尾添加了source ~/.start_Alfred.sh
,因此每次打开终端时,.start_Alfred.sh
中的所有内容都将立即可用。 基本上就是这样:)也许不是最干净的,但超级简单,足以满足我的需求。 Tanktalus和asafpr的答案帮助我提出了这个解决方案。
用例:
mcaay:~ mcaay$ Alfred
Co jest?
>>> thx
np
mcaay:Alfred mcaay$
Thx
是结束python脚本的命令。