【问题标题】:difference in program behavior when run from python script and from windows从 python 脚本和 Windows 运行时程序行为的差异
【发布时间】:2016-06-26 15:14:21
【问题描述】:

一些背景:
程序运行制造机器。该程序在 Windows XP 上运行。程序控制机器并编写简单的制造日志。
我写了一个 python 脚本,要求用户输入当前的制造项目名称。该脚本将项目名称写入日志文件。这样,我在日志文件中有“项目开发者”,我可以知道哪些制造数据属于哪个项目。
该脚本工作正常:如果项目名称之前不存在,则将项目名称写入日志文件,然后执行机器程序。
问题是,当从脚本运行时,程序不会将制造数据写入日志文件。仅当从 Windows 运行时。
我尝试运行该程序的两个实例:一个来自 Windows,另一个来自脚本。脚本成功将项目名称写入文件,windows运行程序成功将数据写入文件。所以我认为这不是脚本锁定的日志文件的问题。我还检查了两个程序是否在同一用户下运行,所以这不是凭据问题。
这是脚本:

file = open("C:\\Documents and Settings\\User1\\Desktop\\BPanel\BadePanel\\SteelUsage.bsu", "a+")
input = raw_input("Please enter project name:")
input = input.upper ()
for line in file.readlines():
        if input in line:
            print "Project name already exists, executing BadePanel"
            import time
            time.sleep(4)
            import subprocess
            subprocess.Popen(['C:\\Documents and Settings\\User1\\Desktop\\BPanel\BadePanel\\BadePanel.exe'])
            sys.exit(0)
file.write (input+"\n")
print "Project name written to file, executing BadePanel"
import time
time.sleep(4)
import subprocess
subprocess.Popen(['C:\\Documents and Settings\\User1\\Desktop\\BPanel\BadePanel\\BadePanel.exe'])
sys.exit(0)
file.close()  

我也尝试过将 import os 与 os.system 一起使用,并将 suprocess 与 subprocess.call 一起使用,而不是 subprocess.Popen
两者都给出了相同的结果。
谢谢

我的代码很奇怪,因为我不是程序员,这只是我的第二个 python 脚本 :) 我根据 eryksun、joel 和 caenyon 的建议更改了代码:

file = open("C:\\Documents and settings\\User1\\Desktop\\BPanel\BadePanel\\SteelUsage.bsu", "a+")
import time
import subprocess
input = raw_input("Please enter project name:")
input = input.upper ()
for line in file.readlines():
        if input in line:
            print "Project name already exists, executing BadePanel"
            import time
            time.sleep(4)
            file.close()
            subprocess.Popen(['C:\\Documents and Settings\\User1\\Desktop\\BPanel\\BadePanel.exe'])
            exit()
file.write (input+"\n")
print "Project name written to file, executing BadePanel"
time.sleep(4)
file.close()
subprocess.Popen(['C:\\Documents and Settings\\User1\\Desktop\\BPanel\BadePanel\\BadePanel.exe'])
exit()  

但我仍然会得到相同的结果..

【问题讨论】:

  • 仅供参考,不要对目录进行硬编码。应用程序目录可以从os.path.abspath(os.path.dirname(sys.argv[0])) 确定。可以相对于该目录打开其他文件,例如os.path.join(appdir, "SteelUsage.bsu")。此外,将您的导入移动到脚本的顶部。循环重复导入同一个模块是没有意义的。
  • 您的代码有一些奇怪的地方。首先,在顶部进行导入,并且永远不要循环导入。它们不会受到伤害,但无论如何它们只会导入一次。其次, sys.exit(0) 将退出您的程序,因此您的循环将在您第一次收到输入时停止。此外,您的代码没有导入 sys,因此这不是您的完整代码。
  • 我不明白你的问题。请将其缩减为minimal reproducible example
  • 我的代码很奇怪,因为我不是程序员,这只是我的第二个 python 脚本 :)
  • 嗨,我修改了代码,正如你在我编辑的帖子中看到的那样。谢谢你的建议

标签: python windows logging exe


【解决方案1】:

如果您希望 BadePanel 程序写入 Steelusage.bsu 文件,您应该在调用 BadePanel.exe 之前从 python 脚本中关闭该文件。如果您不这样做,该文件仍将由您的脚本打开,并且您调用的 exe 将无法向该文件写入数据。

【讨论】:

  • 可能是这种情况,但这取决于程序希望如何共享对文件的访问权限。 Python 以读写共享方式打开文件。
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多