Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过双击启动时,我的Python脚本中的文件路径失败(Windows 10)_Python_Windows_Cmd_Cygwin - Fatal编程技术网

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

通过双击启动时,我的Python脚本中的文件路径失败(Windows 10),python,windows,cmd,cygwin,Python,Windows,Cmd,Cygwin,我有一个python脚本,可以读取和写入相对于它的文件,这些文件位于它上面和旁边的目录中。当我通过Cygwin使用 python script.py 这个程序运行得很好。但是,当我通过windows GUI导航到我的文件并双击来运行它时,我会得到一个空白的cmd提示符,然后我的程序会正常运行,直到我到达需要访问其他文件的位置,此时它会失败,并在cmd提示符中给我以下消息,该提示符会自动打开: ../FFPRM.TXT

我有一个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 
哪个是正确的位置


我想我在谷歌没有什么运气,因为我似乎无法构造一个足够的搜索查询。有人能给我指出正确的方向吗?

[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有错并不奇怪。你能推荐一个解决方案吗?我真的很赞成