一些背景:
程序运行制造机器。这个程序运行在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()
但我得到相同的结果..
仅供参考,不要硬编码目录。应用程序目录可以从'os.path.abspath(os.path.dirname(sys.argv [0]))'确定。其他文件可以相对于该目录打开,例如, 'os.path.join(appdir,“SteelUsage.bsu”)'。另外,将导入移动到脚本的顶部。在循环中重复导入相同的模块是毫无意义的。 – eryksun
关于你的代码有一些奇怪的东西。首先,在顶部进行导入,并且永远不要导入循环。他们不会受到伤害,但他们只能进口一次。其次,sys.exit(0)会退出你的程序,所以你的循环会在你第一次输入时停止。此外,你的代码不会导入sys,所以这不是你的完整代码。 –
我不明白你的问题。请把它切成[mcve]。 – Teepeemm