通过双击启动时,我的Python脚本中的文件路径失败(Windows 10)
我有一个python脚本,可以读取和写入相对于它的文件,这些文件位于它上面和旁边的目录中。当我通过Cygwin使用通过双击启动时,我的Python脚本中的文件路径失败(Windows 10),python,windows,cmd,cygwin,Python,Windows,Cmd,Cygwin,我有一个python脚本,可以读取和写入相对于它的文件,这些文件位于它上面和旁边的目录中。当我通过Cygwin使用 python script.py 这个程序运行得很好。但是,当我通过windows GUI导航到我的文件并双击来运行它时,我会得到一个空白的cmd提示符,然后我的程序会正常运行,直到我到达需要访问其他文件的位置,此时它会失败,并在cmd提示符中给我以下消息,该提示符会自动打开: ../FFPRM.TXT
python script.py
这个程序运行得很好。但是,当我通过windows GUI导航到我的文件并双击来运行它时,我会得到一个空白的cmd提示符,然后我的程序会正常运行,直到我到达需要访问其他文件的位置,此时它会失败,并在cmd提示符中给我以下消息,该提示符会自动打开:
../FFPRM.TXT
../2025510296/FFPRM_000.TXT
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\rbanks\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1549, in __call__
return self.func(*args)
File "C:\Users\rbanks\Desktop\TSAC\EXECUTABLE\T-SAC_GUI.py", line 705, in run_exe
invalid_entry, output_text = self.apply()
File "C:\Users\rbanks\Desktop\TSAC\EXECUTABLE\T-SAC_GUI.py", line 694, in apply
p = subprocess.Popen(['cp', output_file_path, output_file_path_id])
File "C:\Users\rbanks\AppData\Local\Programs\Python\Python35-32\lib\subprocess.py", line 950, in __init__
restore_signals, start_new_session)
File "C:\Users\rbanks\AppData\Local\Programs\Python\Python35-32\lib\subprocess.py", line 1220, in _execute_child startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified
我将此脚本以及目录结构部署为zip,以便用户能够解压并在其PC上的任何位置使用,因此,对于我来说,能够通过简单的双击和我的相对文件路径来运行它是很重要的
我的第一个想法是在另一个环境中打开并执行脚本的cmd提示符,但当我运行时:
cd
pause
在.cmd脚本中,我得到:
C:\Users\rbanks\Desktop\TSAC\EXECUTABLE>pause
哪个是正确的位置
我想我在谷歌没有什么运气,因为我似乎无法构造一个足够的搜索查询。有人能给我指出正确的方向吗?[edit]另一个答案是正确的(至少我怀疑),但我将把这个留在这里,希望它能帮助op未来解决路径问题。。。而做这样的事情通常都是很好的做法
使用 在脚本的顶部 后者
txt_file = os.path.join(BASEPATH,"my_file.txt")
甚至
txt_file = os.path.join(BASEPATH,"..","my_file.txt")
这给了你能够做以下事情的好处
if not os.path.exists(txt_file):
print "Cannot find file: %r"%txt_file
这可能会让您更好地了解您的问题实际可能是什么(如果它至少与路径相关)[edit]另一个答案是正确的(至少我怀疑),但我将把它留在这里,希望它能帮助op在未来解决路径问题。。。而做这样的事情通常都是很好的做法
使用 在脚本的顶部 后者
txt_file = os.path.join(BASEPATH,"my_file.txt")
甚至
txt_file = os.path.join(BASEPATH,"..","my_file.txt")
这给了你能够做以下事情的好处
if not os.path.exists(txt_file):
print "Cannot find file: %r"%txt_file
这可能会让您更好地了解您的问题实际可能是什么(如果它至少与路径相关)问题不是当前目录。双击图标是正确的 问题是:Cygwin命令不在windows路径中 您使用的是python,所以不要运行像这样的简单复制命令,这会使您的脚本不可移植,并且会发生变化,需要安装cygwin等等
p = subprocess.Popen(['cp', output_file_path, output_file_path_id])
可以用
import shutil
shutil.copyfile(output_file_path, output_file_path_id)
现在您有了一个100%pythonic解决方案native,如果无法读/写文件,它将抛出异常,因此完全集成到程序的其余部分中
在从Python运行外部命令之前,请确保不存在Python方式。有那么多有用的模块
关于如何避免从python运行基本命令的其他示例(当然,如果需要运行C编译,则情况有所不同!):
等等。。。python规则 问题不在于当前目录。双击图标是正确的 问题是:Cygwin命令不在windows路径中 您使用的是python,所以不要运行像这样的简单复制命令,这会使您的脚本不可移植,并且会发生变化,需要安装cygwin等等
p = subprocess.Popen(['cp', output_file_path, output_file_path_id])
可以用
import shutil
shutil.copyfile(output_file_path, output_file_path_id)
现在您有了一个100%pythonic解决方案native,如果无法读/写文件,它将抛出异常,因此完全集成到程序的其余部分中
在从Python运行外部命令之前,请确保不存在Python方式。有那么多有用的模块
关于如何避免从python运行基本命令的其他示例(当然,如果需要运行C编译,则情况有所不同!):
等等。。。python规则 问题不在于当前目录。双击iconI是正确的。我混合了向下投票(因为它不能回答问题)和向上投票,因为1)你的代表给我留下了深刻印象并为你担保,2)BASEPATH技术不知何故被遗忘了,人们倾向于要求他们的程序在当前目录下运行,阻止其代码从路径运行。我个人每次都在鼓吹这项技术(所以最后我投了赞成票:)。对于主脚本,更普遍的做法是使用
os.path.abspath(os.path.dirname(sys.argv[0])
。例如,如果将程序冻结为EXE,则其\uuuu文件\uuuu
将为None
。无论哪种方式,都需要重复一点,即脚本不应该依赖于工作目录来查找自相关路径和资源。如果从另一个工作目录运行,它将失败,例如,从Windows Win+R对话框运行时,工作目录将是%SystemRoot%\System32
。问题不是当前目录。双击iconI是正确的。我混合了向下投票(因为它不能回答问题)和向上投票,因为1)你的代表给我留下了深刻印象并为你担保,2)BASEPATH技术不知何故被遗忘了,人们倾向于要求他们的程序在当前目录下运行,阻止其代码从路径运行。我个人每次都在鼓吹这项技术(所以最后我投了赞成票:)。对于主脚本,更普遍的做法是使用os.path.abspath(os.path.dirname(sys.argv[0])
。例如,如果将程序冻结为EXE,则其\uuuu文件\uuuu
将为None
。无论哪种方式,都需要重复一点,即脚本不应该依赖于工作目录来查找自相关路径和资源。如果从另一个工作目录运行,它将失败,例如,当从Windows Win+R对话框运行时,工作目录将是%SystemRoot%\System32
。谢谢你,Jean,我发现Cygwin有错并不奇怪。你能推荐一个解决方案吗?我真的很赞成