我编写了一个简单的Python文件 Example.py ,如此
import sqlite3
conn = sqlite3.connect('test.db')
c=conn.cursor()
Cursor = c.execute("SELECT position,department from STAFF")
conn.close()
当我在命令行窗口中运行文件时
$python Example.py
效果非常好。在Ubuntu 16.04中使其可执行后。 LTS与
$sudo chmod -x Example.py
并尝试通过 Example.desktop 文件打开它,其中包含
[Desktop Entry]
Name=Example
Exec=/home/workspace/Example.py
Terminal=False
Type=Application
Icon=/home/Desktop/Example.jpg,
它不起作用。通过插入图像的开口,我可以跟踪问题到行
$Cursor = c.execute("SELECT position,department from STAFF").
任何人都知道为什么会这样以及如何解决它?
答案 0 :(得分:1)
由于您正在使用相对路径(sqlite3.connect('test.db'))加载SQLite文件,因此您可以在其中执行脚本。当您运行.desktop
文件时,它会像您从桌面启动脚本一样执行,而您的脚本会在那里查找test.db
,而您的实际test.db
文件位于/home/workspace
。< / p>
要使您的脚本从/home/workspace
执行,因此所有相对路径都基于它,您需要将Path
属性添加到[Desktop Entry]
部分:
[Desktop Entry]
Name=Example
Path=/home/workspace
Exec=/home/workspace/Example.py
# etc.
现在,当Example.py
运行时,它就像您cd /home/workspace && /home/workspace/Example.py
一样运行,因此所有本地路径都相对于/home/workspace
。您甚至可以直接在Python中验证当前的工作目录:
import os
print(os.getcwd())
如果您在.desktop
文件中执行此操作而未指定Path
,则会将您的桌面作为当前工作目录。
更新 - 如果您想知道为什么import some_other_file
在没有设置工作目录的情况下工作,那是因为Python会自动添加脚本的主目录,并在其{{1}中执行保证sys.path
语句也可以搜索脚本的主文件夹等。
但是,这仅适用于import
语句,它不适用于文件访问中使用的相对路径或任何类型,这就是为什么import
无法打开正确的文件不提供路径(或设置脚本所在位置的当前工作路径)。
如果您不想指定工作目录但仍希望利用具有相对路径的文件,则必须先获取脚本的路径,然后在提供打开SQLite的路径之前将文件名附加到该路径,像:
sqlite
现在,在您的情况下,如果import os
import sqlite3
# there are some exceptions where this will not work but for your case it's enough:
home_dir = os.path.realpath(os.path.dirname(__file__)) # your script's home dir
conn = sqlite3.connect(os.path.join(home_dir, "test.db"))
# etc.
位于您脚本的主文件夹中,sqlite
将获得test.db
的实际路径,而不是仅仅获取空白test.db
并在当前的工作目录。