Python ubuntu 16.04中的可执行.desktop文件存在sqlite3问题。LTS

Python ubuntu 16.04中的可执行.desktop文件存在sqlite3问题。LTS,python,sqlite,ubuntu-16.04,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中使其可执行后。与 $sudo chmod

我编写了一个简单的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中使其可执行后。与

$sudo chmod -x Example.py
并尝试通过一个示例.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").

有人知道为什么会这样以及如何修复吗?

因为您正在加载SQLite文件,其中包含一个相对路径(sqlite3.connect('test.db')),一个从中执行脚本的工作目录。当您运行
.desktop
文件时,它的执行就像您从桌面启动脚本一样,脚本在那里查找
test.db
,而实际的
test.db
文件位于
/home/workspace

要使脚本从
/home/workspace
执行,从而使所有相关路径都基于它,您需要将
路径
属性添加到
[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
文件执行此操作而未指定
路径
,则会将您的桌面作为当前工作目录

更新-如果您想知道为什么
导入一些其他文件
在不设置工作目录的情况下工作,那是因为Python会自动将其执行的脚本的主目录添加到其
sys.path
中,以确保
导入
语句可以搜索,等等,脚本的主文件夹也是如此

但是,这只适用于
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
并在当前工作目录中查找它。

您是否尝试过在
示例中设置:
path=/home/workspace
[桌面输入]
正如我昨天告诉你的那样?是的,我做了,但不幸的是,没有用。对不起,我的代码中有另一个错误。它确实起到了作用。你能详细说明为什么这对我来说很难理解,因为这更多的是关于我想了解计算机体系结构的愿望,而不是关于具体问题。另外,关于post呢我知道路径是用来指示计算机在哪里查找被调用的文件的。我只是想知道为什么从同一目录导入其他python文件没有问题,但是当涉及sqlite数据库时,它需要path语句。谢谢你的解释。我只是想知道弄清楚为什么只有这个sqlite3调用才有必要。如果我从Example.py调用该目录中的另一个python文件,它不需要执行Example.py的路径,甚至不需要从另一个python文件检索函数调用返回。在这个实例中,sqlite3调用有什么特殊之处?