如何将python脚本作为可执行文件运行并保持对其周围文件的访问?

2024-06-25 05:19:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python程序“艾尔弗雷德.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

意思是艾尔弗雷德.py找不到.db文件,创建了它,但它是空的,因此没有名为“repairs”的表。此.db文件与艾尔弗雷德.py. 你知道吗

我之前所做的:

  • 添加“#”!/usr/bin/env python3“作为艾尔弗雷德.py你知道吗
  • 键入“chmod+x/Users/mcay/Documents/Moje\Dokumenty/MANTA/Alfred/艾尔弗雷德.py“在终端中使其可执行
  • 将“export PATH=$PATH:/Users/mcaay/Documents/Moje\Dokumenty/MANTA/Alfred/”添加到我的.bash\u配置文件中艾尔弗雷德.py在航站楼的任何地方都可以买到
  • 创建阿尔弗雷德.桌面可单击图标的文件:
[Desktop Entry]
Name=Alfred
Exec=python3 /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/Alfred.py
Terminal=true
Type=Application
  • 制造阿尔弗雷德.桌面可通过键入“chmod+x/Users/mcay/Documents/Moje\Dokumenty/MANTA/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”,我会得到:

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

我只想输入“阿尔弗雷德”工作,我希望它看到数据库和其他文件正确,或者如果点击图标将正常工作,这是可以接受的。我的google Fu让我失望了。你要做什么?你知道吗

另外,我注意到在我的主目录(“/Users/mcaay”)中创建了一个数据库文件,好像艾尔弗雷德.py从原始目的地拉到某个临时目的地并在那里执行(其他文件没有拉,所以程序崩溃)。你知道吗


Tags: 文件py数据库终端键入users桌面documents
3条回答

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

好吧,睡了一个好觉之后,我读到的东西终于在我的脑子里计算出来了,我得到了答案。我以前所做的一切都是多余的,可以丢弃。你知道吗

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

  1. 在home目录中,我创建了一个名为.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脚本的命令。你知道吗

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

相关问题 更多 >