我有一个python脚本,可以读取和写入相对于它的文件,位于它上面和旁边的目录中。当我使用
通过Cygwin运行我的脚本时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
哪个位置正确。
我对谷歌没有任何好运,我认为因为我似乎无法构建足够的搜索查询。有人能指出我正确的方向吗?
答案 0 :(得分:4)
[编辑] 另一个答案是正确的(至少我怀疑)但我会留在这里,希望它可以帮助未来的路径问题...并做一些事情像这样只是一般的好习惯
使用
BASEPATH = os.path.abspath(os.path.dirname(__file__))
位于脚本顶部
后来的
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
这可能会让您更好地了解您的问题实际上是什么(如果它的简单路径至少相关)
答案 1 :(得分:2)
问题不在于当前目录。双击图标
时是正确的问题是: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解决方案,原生的,如果无法读/写文件会抛出异常,所以完全集成在你的程序的其余部分。
在从Python运行外部命令之前,请确保不存在任何python方式。那里有很多有用的模块。
如何避免从python运行基本命令的其他示例(当然如果你需要运行C编译,那就不同了!):
- zipfile package: much better than running `zip.exe`
- gzip package: can open gzipped files natively from python
- `os.listdir()` instead of running `cmd /c dir /B`
等......蟒蛇规则!