首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将python脚本作为可执行文件运行,并保持对其周围文件的访问?

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

Stack Overflow用户
提问于 2019-01-24 19:17:55
回答 3查看 85关注 0票数 1

我有一个python程序"Alfred.py“,我想通过点击一个图标或者在终端中输入"Alfred”来运行它。它连接到数据库文件,并在被请求时提取Excel文件。当我试图通过点击运行它时,我得到的是:

代码语言:javascript
复制
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]

这一行:

代码语言:javascript
复制
sqlite3.OperationalError: no such table: repairs

这意味着Alfred.py没有找到.db文件,而是创建了它,但是它是空的,所以没有一个称为“修复”的表。此.db文件位于与Alfred.py相同的目录中。

我到现在为止所做的:

  • 添加"#!/usr/bin/env python3“作为Alfred.py的第一行
  • 在终端输入"chmod +x /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/Alfred.py“,使其可执行
  • 在我的.bash_profile中添加了"export =$PATH:/Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/“,以使Alfred.py可以从终端的任何地方使用。
  • 为可单击的图标创建Alfred.desktop文件:
代码语言:javascript
复制
[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.py“时,我得到:

代码语言:javascript
复制
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“一样。如果我只输入“阿尔弗雷德”,我就会得到:

代码语言:javascript
复制
mcaay:~ mcaay$ Alfred
-bash: Alfred: command not found

我只想输入“阿尔弗雷德”来工作,我希望它能正确地看到数据库和其他文件,或者,如果点击图标将正常工作,这也是可以接受的。我的Googe Fu在这里辜负了我。做什么?

P.S.我注意到在我的主目录("/Users/mcaay")中创建了一个数据库文件,就好像Alfred.py被从原来的目的地拖到某个临时目的地并在那里执行(其他文件没有被拉出,程序崩溃了)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-25 07:18:27

好的,在睡了一个好觉之后,我读到的东西终于在我脑子里算出来了,我得到了答案。我以前所做的一切都是不必要的,可以被抛弃。

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

  1. 在主目录中,我创建了一个名为.start_alfred.sh的文件。这是一个shell脚本,它在终端中有一个可调用的命令,可以转到我指定的目录,然后运行python脚本。
  2. 在里面,我写了这个:
代码语言:javascript
复制
#!/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的回答帮助我想出了这个解决方案。

用例:

代码语言:javascript
复制
mcaay:~ mcaay$ Alfred

Co jest?
>>> thx
np

mcaay:Alfred mcaay$ 

Thx是结束python脚本的命令。

票数 0
EN

Stack Overflow用户

发布于 2019-01-24 19:23:43

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

票数 0
EN

Stack Overflow用户

发布于 2019-01-24 19:27:16

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54353865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档