通过双击启动时,我的Python脚本中的文件路径失败(Windows 10)

时间:2016-08-02 20:08:36

标签: python windows cmd cygwin

我有一个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 

哪个位置正确。

我对谷歌没有任何好运,我认为因为我似乎无法构建足够的搜索查询。有人能指出我正确的方向吗?

2 个答案:

答案 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`

等......蟒蛇规则!