![](/img/trans.png)
[英]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.