2016-06-26 50 views
1

一些背景:
程序运行制造机器。这个程序运行在Windows XP上。该程序控制机器并写入一个简单的制造日志。
我写了一个python脚本,要求用户输入当前的制造项目名称。该脚本将项目名称写入日志文件。这样,我在日志文件中就有了“项目分工”,并且我知道哪些制造数据属于哪个项目。
该脚本正常工作:项目名称被写入日志文件(如果之前不存在),并执行机器程序。
问题是,从脚本运行时,程序不会将制造数据写入日志文件。只有当从Windows运行。
我试着运行该程序的两个实例:一个来自Windows,另一个来自脚本。脚本将项目名称成功写入文件,并且Windows运行程序将成功将数据写入文件。所以我认为这不是脚本锁定的日志文件的问题。我也检查了两个程序在同一用户下运行,所以它不是凭证问题。
这里的脚本:从python脚本和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() 

我也用进口的操作系统与使用os.system尝试,并导入suprocess与subprocess.call,代替subprocess.Popen
俩给相同的结果。
谢谢

我的代码很奇怪,因为我不是一个程序员,这只是我的第二个Python脚本:)我根据eryksun改变了代码,乔尔和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() 

但我得到相同的结果..

+0

仅供参考,不要硬编码目录。应用程序目录可以从'os.path.abspath(os.path.dirname(sys.argv [0]))'确定。其他文件可以相对于该目录打开,例如, 'os.path.join(appdir,“SteelUsage.bsu”)'。另外,将导入移动到脚本的顶部。在循环中重复导入相同的模块是毫无意义的。 – eryksun

+0

关于你的代码有一些奇怪的东西。首先,在顶部进行导入,并且永远不要导入循环。他们不会受到伤害,但他们只能进口一次。其次,sys.exit(0)会退出你的程序,所以你的循环会在你第一次输入时停止。此外,你的代码不会导入sys,所以这不是你的完整代码。 –

+0

我不明白你的问题。请把它切成[mcve]。 – Teepeemm

回答

0

如果你想让程序BadePanel写入Steelusage.bsu文件,你应该在调用BadePanel.exe之前关闭python脚本中的文件。如果你不这样做,文件仍然会被你的脚本打开,你调用的exe文件将不能写入数据。

+0

这可能是这样的,但是这取决于程序希望如何共享文件的访问权限。 Python以读写共享的方式打开文件。 – eryksun