[英]How can I see which sqlite3 binary does the sqlite3 Python module use on Ubuntu 16.04?
[英]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.