如何以可执行文件身份运行python脚本并保持对其周围文件的访问?

时间:2019-01-24 19:17:55

标签: python python-3.x bash sqlite

我有一个Python程序“ Alfred.py”,我希望它可以通过在终端中单击图标或键入“ Alfred”来运行。它被连接到数据库文件,并在需要时提取Excel文件。当我尝试通过单击运行它时,这就是我得到的:

mcaay:~ mcaay$ /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/Alfred.desktop ; exit;
/Users/mcaay/Documents/Moje Dokumenty/MANTA/Alfred/Alfred.desktop: line 1: [Desktop: command not found
Traceback (most recent call last):
  File "/Users/mcaay/Documents/Moje Dokumenty/MANTA/Alfred/Alfred.py", line 59, in <module>
    AND Usterka IS NOT NULL;""")
sqlite3.OperationalError: no such table: repairs
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Process completed]

此行:

sqlite3.OperationalError: no such table: repairs

意味着Alfred.py找不到.db文件,创建了该文件,但它为空,因此没有称为“修复”的表。该.db文件与Alfred.py位于同一目录中。

到目前为止我所做的事情:

  • 在Alfred.py的第一行中添加了“#!/ usr / bin / env python3”
  • 在终端中键入“ chmod + x / Users / mcaay / Documents / Moje \ Dokumenty / MANTA / Alfred / Alfred.py”以使其可执行
  • 在我的.bash_profile中添加了“ export PATH = $ PATH:/ Users / mcaay / Documents / Moje \ Dokumenty / MANTA / Alfred /”以使Alfred.py可以从终端中的任何位置访问
  • 为可点击图标创建了Alfred.desktop文件:
[Desktop Entry]
Name=Alfred
Exec=python3 /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/Alfred.py
Terminal=true
Type=Application
  • 通过在终端中键入“ chmod + x / Users / mcaay / Documents / Moje \ Dokumenty / MANTA / Alfred / Alfred.desktop”,使Alfred.desktop可执行文件

当我输入终端“ Alfred.py”时,我得到:

mcaay:~ mcaay$ Alfred.py
Traceback (most recent call last):
  File "/Users/mcaay/Documents/Moje Dokumenty/MANTA/Alfred/Alfred.py", line 59, in <module>
    AND Usterka IS NOT NULL;""")
sqlite3.OperationalError: no such table: repairs

与单击“ Alfred.desktop”相同。 如果我只输入“ Alfred”,则会得到:

mcaay:~ mcaay$ Alfred
-bash: Alfred: command not found

我只想键入“ Alfred”即可工作,并且希望它正确查看数据库和其他文件,或者如果单击该图标也可以正常工作,那也是可以接受的。我的Googe-Fu在这里失败了我。怎么办?

P.S。我注意到在我的主目录(“ / Users / mcaay”)中创建了一个数据库文件,好像Alfred.py是从原始目标位置拉到某个临时目标并在那里执行的(其他文件没有被拉出,因此程序崩溃了)。

3 个答案:

答案 0 :(得分:0)

当您告诉SQLite在哪里找到数据库时,您使用的是相对路径,但是该相对路径是相对于当前工作目录的。您需要在脚本中更改目录或为SQLite提供数据库的完整路径。无论哪种方式,这都需要逻辑来查找脚本的位置,或者您可以将数据库放置在另一个众所周知的路径(例如~/.config/alfred)中。就个人而言,我更喜欢始终构建完整路径,并尽可能避免使用相对路径(和更改目录)选项,但是脚本路径的chdir也应相对安全,并且此时可能需要较少的更改。 / p>

答案 1 :(得分:0)

我认为它只是在执行目录中寻找.db文件。您应该使用绝对路径定义.db或在可以获取脚本的同一目录中访问.db文件。使用: os.path.dirname(sys.argv[0])

答案 2 :(得分:0)

好吧,经过一整夜的睡眠,我所读到的东西终于浮现在脑海中,我得到了答案。我之前所做的一切都是不必要的,可以将其丢弃。

我的解决方案(请记住,我正在使用macOS Mojave atm):

  1. 在主目录中,我创建了一个名为.start_alfred.sh的文件。 这是一个Shell脚本,它将在终端中具有一个可调用的命令,以转到我指定的目录,然后运行python脚本。
  2. 在里面,我这样写:
#!/bin/bash

function Alfred() {
    cd /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred
    python3 Alfred.py
}

此函数的名称(Alfred)将调用其中包含的shell命令。基本上,这是您在终端中通常会启动程序的工作。

  1. 在我的.bash_profile中,我在末尾添加了source ~/.start_Alfred.sh,因此每次打开终端时,.start_Alfred.sh中的所有内容都将立即可用。

基本上就是这样:)也许不是最干净的,但超级简单,足以满足我的需求。 Tanktalus和asafpr的答案帮助我提出了这个解决方案。

用例:

mcaay:~ mcaay$ Alfred

Co jest?
>>> thx
np

mcaay:Alfred mcaay$ 

Thx是结束python脚本的命令。