如何找到当前运行的Python脚本的完整路径?也就是说,我需要做些什么来实现这个目标:
$ pwd
/tmp
$ python baz.py
running from /tmp
file is baz.py
Run Code Online (Sandbox Code Playgroud) 我在脚本中使用这段代码以跨平台的方式确定运行的确切位置:
SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__))
Run Code Online (Sandbox Code Playgroud)
很简单.然后我继续在SCRIPT_ROOT我的脚本的其他区域使用,以确保一切都是正确的相对.我通过py2exe运行时出现问题,因为生成的可执行文件未设置__file__,因此我的脚本中断.有谁知道如何解决或解决这个问题?
编辑3:当我需要知道我的脚本/可执行文件的位置时,我替换__file__了sys.argv[0].这不完全一样,但在我的情况下它似乎运行良好(至少在可执行版本...).现在一切都工作正常,在单文件模式下,使用接受的答案功能来访问资源文件!
编辑2:如接受的答案的评论所示,问题来自我的脚本中的路径解析; 我尝试使用__file__获取脚本的位置,以便我可以访问其资源文件.打包后这不起作用,因为它__file__会将文件名从Python.dll脚本返回到脚本,所以总是没有路径而只是文件名.所以我必须找到另一种技巧来访问资源文件; 目前解决方法是将当前目录移动到可执行路径.
顺便说一句,这意味着ConfigParser应该在访问文件时报告问题,而不是缺少某个部分.
我将以解决此路径解析问题的方式更新此问题.
我遇到了问题pyinstaller,因为这是我第一次使用它,我确信我做错了.
所以,这就是问题:pyisntaller在我编写的脚本上顺利运行,并在dist文件夹中生成一些东西.好的,所以现在我想执行它以查看是否一切顺利,这就是我得到的:
C:\Program Files\PyInstaller\pyinstaller-1.5.1>p_tool\dist\p_tool\p_tool.exe -?
Traceback (most recent call last):
File "<string>", line 104, in <module>
File "p_tool\build\pyi.win32\p_tool\outPYZ1.pyz/logging.config", line 76, in f
ileConfig
File "p_tool\build\pyi.win32\p_tool\outPYZ1.pyz/logging.config", line 112, in
_create_formatters
File "p_tool\build\pyi.win32\p_tool\outPYZ1.pyz/ConfigParser", line 532, in ge
t
ConfigParser.NoSectionError: No section: 'formatters'
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是logging.conf文件丢失了,所以我在文件中添加了它(以及其他一些资源文件)p_tool.spec,但这并不是更好.
Python版本:2.6.6,在WinXP下.我正在使用,pyinstaller因为我需要它来封装Solaris工作站的文件.
那么,有人确实有这个问题吗?唯一相关的主题是以下问题:PyInstaller问题,非常接近我的问题,但绝对没有答案.
Edit3:删除日志记录的详细信息,与问题无关.
我正在尝试使用其中的这一行来编译Python代码,它没有创建任何目录,但其他一切都正常。
os.mkdir('{}\\{}'.format(dir_path, scenario['name']))
Run Code Online (Sandbox Code Playgroud)
我使用 --console 标志进行编译,运行时没有错误。我也以管理员身份运行。谢谢你的帮助。
这是我获取 dir_path 的方法
if getattr(sys, 'frozen', False):
dir_path = sys._MEIPASS
else:
dir_path = os.path.dirname(os.path.abspath(__file__))
Run Code Online (Sandbox Code Playgroud) 我用 python 制作了一个程序,当使用 python 解释器运行时它可以正确运行。它从同一目录中读取一些文件。为了从其他路径运行脚本,脚本将其工作目录更改为自己的位置。
import os
abspath = os.path.realpath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)
Run Code Online (Sandbox Code Playgroud)
但是当我将其打包为 .exe 时,这不起作用。因为在运行 .exe 时,__file__变量是"main.py".
我知道可以通过显式设置固定路径来修复它:
os.chdir('/Fixed/Path')
Run Code Online (Sandbox Code Playgroud)
但是有一个优雅的解决方案吗?
我正在使用 pyinstaller 编译 python 应用程序。
结构是这样的——
d:\app\myprog.exe
d:\app\config\settings.conf
Run Code Online (Sandbox Code Playgroud)
如果我myprog.exe --switch value从d:\app它运行,运行得很好,如果我尝试从其他任何地方运行,就像c:\windows它没有找到我的settings.conf文件抱怨消息:
Traceback (most recent call last):
File "<string>", line 284, in <module>
File "<string>", line 218, in main
File "ConfigParser.py", line 330, in get
ConfigParser.NoSectionError: No section: 'database'
myApp returned -1
Run Code Online (Sandbox Code Playgroud)
database作为我试图引用的配置文件中的第一行。
我BASE_DIR在这里引用了应用程序 -
# Global Path and Config Info
try:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
except NameError: # We are the main py2exe script, not a module
BASE_DIR = os.path.dirname(os.path.abspath(sys.argv[0])) …Run Code Online (Sandbox Code Playgroud) 如何将 QML 文件作为单个可执行文件包含到我的 Python 项目中。当我运行时pyinstaller --onefile main.py,运行可执行文件会导致未找到 QML 文件的错误。除非我使用绝对路径或放置view.qml在与可执行文件相同的目录中。我不想有一个单独的 QML 文件,我希望它合并到可执行文件中。
主要.py:
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load(QUrl("view.qml"))
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
视图.qml:
import QtQuick 2.0
ApplicationWindow {
id: window
title: "Window"
width: 900
height: 600
visible: true
}
Run Code Online (Sandbox Code Playgroud)