簡體   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