繁体   English   中英

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

[英]sqlite3 problems with executable .desktop file in ubuntu 16.04. LTS

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

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

由于您要使用相对路径(sqlite3.connect('test.db'))加载SQLite文件,因此需要一个工作目录,您可以在该目录中执行脚本。 当您运行.desktop文件时,它的执行就像从桌面启动脚本一样,并且脚本在其中查找test.db ,而实际的test.db文件位于/home/workspace

要使脚本从/home/workspace执行,并因此从中执行所有相对路径,您需要在[Desktop Entry]部分中添加Path属性:

[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则它将为您提供Desktop作为当前工作目录。

更新 -如果您想知道为什么import some_other_file可以在不设置工作目录的情况下工作,那是因为Python会自动在其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.

现在,以您的情况test.db如果sqlite位于脚本的主文件夹中,则它将获得test.db的实际路径,而不仅仅是获取空白的test.db并在当前工作目录中查找它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM