python 程序在被 运行 打开时无法运行

python program doesn't work when opened by run

我正在使用 Windows 7 x64,当我通过 Windows - 运行 打开我的程序时,它无法正常工作。它是星标,但当我双击它时,命令无法正常工作。

/run cmd /c start "" "C:\Python27\Scripts\bot.bat"
/run cmd /c start python "C:\Python27\Scripts\bot.py"
/run python "C:\Python27\Scripts\bot.py"

这些我都试过了,都失败了。 只需双击 .bat 文件或 .py 文件即可。

bat 文件只调用 python 文件

@echo off
start "" "C:\Python27\Scripts\bot.py"

我用Windows-运行打开的错误是

[Errno 2] No such file or directory: 'list.txt'

list.txt 位于 Scripts 文件夹内,双击打开它总是有效。

更新

我打开文件进行阅读使用

g = open("list.txt","r")

再次写入:

g = open("list.txt","w")

我已经尝试过 James 解决方案并且它有效,但是由于我有很多使用这些方法的方法,我会做很多工作,因为它不仅仅是查找和替换,它涉及缩进和列表名称更改按照什么方法。

您需要在您的应用程序中执行类似的操作:

import os
import sys

with open(os.path.join(os.path.dirname(sys.argv[0]), "lists.txt"), "r") as f:
    # do something with lists.txt

这消除了 假设,即 lists.txt 将在当前目录或类似目录中。

注意: sys.argv[0] 应该 是正在执行的程序的 "full absolute path" 并且希望 C:\Python27\Scripts\bot.py 在您的系统上。

更新: 使用 sys.argv[0] 的替代方法(谢谢 Alex Taylor)作为 "determining your entrypoint's directory" 的一种方式您还可以使用 __file__,它是 Python 模块中的 "global",即 "full path" 到 that 模块。这里唯一需要注意的是,如果您的 "package" 是压缩的或者是可导入的存档,这将不起作用。参见:__file__

与 James 的回答类似,但使用 __file__ 宏作为获取当前正在执行的脚本的方式:

import os.path

with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'list.txt'), 'r') as list_file:
    list_data = list_file.read()

问题是工作目录设置为您从中双击的位置,但不是按照您提供的方式从命令行启动。打开命令提示符到脚本的位置并从那里启动也可以,因为文件将在工作目录中。

__file___宏一般被认为是best way of determining a python script location