2017-07-23 25 views
0

我寫了一個簡單的Python文件Example.py像這樣在ubuntu 16.04中,可執行文件.desktop文件的sqlite3問題。 LTS

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"). 

任何一個想法,爲什麼會是這樣,如何解決?

+0

你試過在昨天告訴你的'Example.desktop'的'[Desktop Entry]'節中設置:'Path =/home/workspace'嗎? – zwer

+0

是的,我做了,但不幸的是,無濟於事。 –

+0

對不起,我的代碼中存在另一個錯誤。它實際上做了詭計。請您詳細說明爲什麼這樣可以讓我理解,因爲這更多的是關於我對計算機體系結構的理解,而不是對具體問題的理解。另外,如何發佈這個答案,以便我可以批准它? –

回答

1

由於您正在使用相對路徑(sqlite3.connect('test.db'))加載SQLite文件,因此您需要從工作目錄執行腳本。當您運行.desktop文件時,它將執行,就像您從Desktop啓動腳本一樣,並且您的腳本在那裏查找test.db,而您的實際test.db文件位於/home/workspace

使你的腳本由/home/workspace執行,因此所有相對路徑的基礎上,你需要的Path屬性添加到您的[Desktop Entry]節:當你Example.py運行時,它會作爲

[Desktop Entry] 
Name=Example 
Path=/home/workspace 
Exec=/home/workspace/Example.py 
# etc. 

現在如果你做了cd /home/workspace && /home/workspace/Example.py,那麼你所有的本地路徑都是相對於/home/workspace。你甚至可以直接驗證你當前的工作目錄中的Python:

import os 

print(os.getcwd()) 

如果您是從您的.desktop文件沒有指定Path它會給你桌面作爲當前工作目錄中執行此操作。

UPDATE - 如果你想知道爲什麼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. 

,你的情況,sqlite會如果它在你的腳本的主文件夾去test.db一個實際的路徑,而不是隻讓空白test.db並在當前工作目錄中尋找它。

+0

感謝您的解釋。我只是想知道爲什麼只用這個sqlite3調用,這是必要的。如果我從Example.py中調用該目錄中的另一個python文件,它不需要執行Example.py的路徑,甚至不需要從另一個python文件中檢索函數調用返回。在這個例子中,sqlite3調用有什麼特別之處? –

+0

@PaulRousseau - 檢查更新 – zwer