sbuite3问题与ubuntu 16.04中的可执行.desktop文件有关。 LTS

时间:2017-07-23 13:17:25

标签: python sqlite ubuntu-16.04

我编写了一个简单的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").

任何人都知道为什么会这样以及如何解决它?

1 个答案:

答案 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并在当前的工作目录。