Некоторые фон:
Программа запускает производственную машину. Эта программа работает на Windows XP. Программа управляет машиной и записывает простой журнал производства.
Я написал сценарий python, который просит пользователя ввести название текущего проекта. сценарий записывает имя проекта в файл журнала. Таким образом, у меня есть «разработчики проекта» в файле журнала, и я могу знать, какие производственные данные принадлежат к проекту.
Сценарий отлично работает: имена проектов записываются в файл журнала, если они там не существуют, и выполняется машинная программа.
Проблема заключается в том, что программа не записывает данные о производстве в файл журнала при запуске из сценария. Только при запуске из окон.
Я попытался запустить два экземпляра программы: один из окон и один из скрипта. Скрипт успешно записывает имя проекта в файл, а окна запускают программу, записывая данные в файл успешно. Поэтому я думаю, что это не проблема файла журнала, заблокированного скриптом. Я также проверил, что обе программы работают под одним и тем же пользователем, поэтому это не проблема учетных данных.
Вот сценарий:Разница в поведении программы при запуске из сценария python и из окон
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
Оба дали одинаковый результат.
Спасибо
Мой код странно, потому что я не программист, и это только мой второй питон скрипт :) Я изменил код в соответствии с 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()
Но i stll получит тот же результат.
FYI, не печатайте каталог. Каталог приложений можно определить из 'os.path.abspath (os.path.dirname (sys.argv [0])). Другие файлы могут быть открыты относительно этого каталога, например. 'os.path.join (appdir," SteelUsage.bsu ")'. Кроме того, переместите свой импорт в начало скрипта. Целесообразно импортировать один и тот же модуль в цикл. – eryksun
В коде есть пара странных вещей. Сначала сделайте свой импорт вверху и никогда не импортируйте в цикл. Они не будут болеть, но они только импортируют один раз. Во-вторых, sys.exit (0) выйдет из вашей программы, поэтому ваш цикл остановится в первый раз, когда вы получите удар по вводу. Кроме того, ваш код не импортирует sys, поэтому это не ваш полный код. –
Я не понимаю ваш вопрос. Пожалуйста, сократите это до [mcve]. – Teepeemm