2017-07-23 24 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