【问题标题】:python program doesn't work when opened by runpython程序通过run打开时不起作用
【发布时间】:2015-07-14 14:57:25
【问题描述】:

我使用的是 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 解决方案并且它有效,但是由于我有很多方法使用这些方法,所以我会做很多工作,因为它不仅仅是查找和替换,它还涉及缩进,并且列表的名称也会根据方法。

【问题讨论】:

  • 这是您的应用程序内部引发的错误。很可能是“假设”路径的结果。不要做假设!
  • 关于您的更新;你必须弄清楚如何最好地“重构”你的代码。我的第一个建议是更多地使用函数,并且通常使您的代码模块化和可重用。
  • 因为with open 产生了我无法识别的不同类型的错误,例如'file' object has no attribute '__getitem__' 在我尝试调用 .readlines() 时。我可能会更改g = open("C:\Python27\Scripts\list.txt","r").readlines() 以更快地解决它。

标签: python windows python-2.7 irc mirc


【解决方案1】:

你会想在你的应用程序中做这样的事情:

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]应该是正在执行的程序的“完整绝对路径”,并且希望是您系统上的C:\Python27\Scripts\bot.py

更新:除了使用 sys.argv[0]谢谢 Alex Taylor)作为“确定入口点目录”的一种方式之外,您还可以使用 __file__,即Python 模块中的“全局”,它是 that 模块的“完整路径”。这里唯一需要注意的是,如果您的“包”被压缩或以其他方式导入存档,这将不起作用。见:__file__

【讨论】:

    【解决方案2】:

    与 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多