我有一个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“一样。如果我只输入“阿尔弗雷德”,我就会得到:
mcaay:~ mcaay$ Alfred
-bash: Alfred: command not found我只想输入“阿尔弗雷德”来工作,我希望它能正确地看到数据库和其他文件,或者,如果点击图标将正常工作,这也是可以接受的。我的Googe Fu在这里辜负了我。做什么?
P.S.我注意到在我的主目录("/Users/mcaay")中创建了一个数据库文件,就好像Alfred.py被从原来的目的地拖到某个临时目的地并在那里执行(其他文件没有被拉出,程序崩溃了)。
发布于 2019-01-25 07:18:27
好的,在睡了一个好觉之后,我读到的东西终于在我脑子里算出来了,我得到了答案。我以前所做的一切都是不必要的,可以被抛弃。
我的解决方案(请记住,我使用的是macOS Mojave ):
.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脚本的命令。
发布于 2019-01-24 19:23:43
当您告诉SQLite在哪里找到db时,您使用的是一个相对路径,但是该相对路径相对于当前工作目录。您需要改变脚本中的目录,或者给SQLite一个通向db的完整路径。无论哪种方式,这都需要找到脚本所在位置的逻辑,或者可以将db放到另一条众所周知的路径(例如,~/.config/alfred)中。就我个人而言,我更喜欢构建完整的路径,并尽可能避免相对路径(和更改目录)选项,但是脚本路径的chdir也应该相对安全,并且此时可能需要较少的更改。
发布于 2019-01-24 19:27:16
我认为它只是在它执行的目录中查找.db文件。您应该使用绝对路径定义一个.db,或者在脚本的同一个目录中访问.db文件,您可以使用:os.path.dirname(sys.argv[0])
https://stackoverflow.com/questions/54353865
复制相似问题