2015-04-10 2 views
2

У меня есть файл exe, написанный в Prolog. Когда я просто запускаю его, он работает. Мне нужно запустить его из сценария Python, и здесь я получаю сообщение об ошибке. Когда я использую system("PLANNER\Exe\planner.exe") я получаюПозвоните исполнительному директору в Прологе из Python

Exception in module: planner.exe 
c:\program files\visual prolog 7.4 pe\pfc\exception\exception.pro(229) : error r000 

Когда я использую execfile("PLANNER\Exe\planner.exe") я получаю

Traceback (most recent call last): 
    File "main.py", line 29, in <module> 
    execfile("PLANNER\Exe\planner.exe") 
    File "PLANNER\Exe\planner.exe", line 1 
SyntaxError: Non-ASCII character '\x8b' in file PLANNER\Exe\planner.exe on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 

Что я делаю неправильно? Заранее спасибо!

P.S. Это мой код в Прологе

implement shift 
    open core, console, list, file, string 

constants 
    className = "shift/shift". 
    classVersion = "". 

clauses 
    classInfo(className, classVersion). 

domains 
    obj=char. 
    block=obj. 
    state=on(block, obj); clear(obj). 
    action=action(obj From, block Block, obj To). 

class facts 
    isObj:(char). 
    isBlock:(char). 

clauses 
    isBlock('a'). 
    isBlock('b'). 
    isBlock('c'). 

    isObj('1'). 
    isObj('2'). 
    isObj('3'). 
    isObj('a'). 
    isObj('b'). 
    isObj('c'). 

class predicates 
    can : (action, state* Condition) determ (i,o). 
clauses 
    can(action(From, Block, To), C):- 
     C = [clear(To),clear(Block),on(Block, From)], 
     write("!!! ", C),nl, 
     if isMember(clear('c'), C) then 
     write("@@@") 
    end if, 
     To <> Block, 
     From <> To, 
     Block <> From. 

class predicates 
    plan : (state* State, state* Goals , state* ProtectedGoals, action* Plan, state* FinalState) 
                             nondeterm (i,i,i,o,o). 
clauses 
    plan(State, Goals, _, [], State):- 
    % write("!!State: ", State, " Goals: ", Goals),nl, 
     satisfied(State, Goals), 
     %write("yes"),nl, 
     !. 
    plan(State, Goals, Protected, Plan, FinalState):- 

     select(State, Goals, Goal), 
write("State: ", State, " Goals: ", Goals, " Goal: ", Goal), nl, 
     achieves(Action, Goal, State), 
%write("Action: ", Action, "Goal: ", Goal), nl, 
     write("Action: ", Action), nl, 
     preserves(Action, Protected), 
     can(Action, Condition), 
     % write(" Condition: ", Condition), nl, 
     plan(State, Condition, Protected, Preplan, Midstate1), 
%write("Midstate1: ", Midstate1),nl, 
     Midstate2 = apply(Midstate1, Action), 
     %write("Action: ", Action, " Midstate2: ", Midstate2), nl, 
     plan(Midstate2, Goals, [Goal|Protected], Postplan, FinalState), 
     conc(Preplan, Action, Postplan, Plan). 

class predicates 
    preserves : (action, state*) determ. 
clauses 
    preserves(_, []) :- !. 
    preserves(action(From, Block, To), [Goal|Goals]) :- 
     Goal <> on(Block, From), 
     Goal <> clear(To), 
     preserves(action(From, Block, To), Goals). 

class predicates 
    apply : (state*, action) -> state*. 
clauses 
    apply([], _) = [] :- !. 
    apply([clear(To)|State], action(From, Block, To)) = [clear(From)|apply(State, action(From, Block, To))] :- !. 
    apply([S|State], action(From, Block, To)) = [S1|apply(State, action(From, Block, To))] :- 
     S = on(Block, From), 
     S1 = on(Block, To), 
     !. 
    apply([S|State], Action) = [S|apply(State, Action)]. 

class predicates 
    achieves : (action, state Goal, state* State) nondeterm (o,i, i). 
clauses 
    achieves(action(Object, B, To), clear(Object), State) :- 
     isBlock(B), 
     isObj(To), 
     Object <> B, 
     Object <> To, 
     B <> To, 
     isMember(on(B, Object), State), 
     isMember(clear(To), State). 
    achieves(action(From, Block, Object), on(Block, Object), State) :- 
     isObj(From), 
     From <> Block, 
     From <> Object, 
     isMember(on(Block, From), State). 

class predicates 
    select : (state*, state*, state) nondeterm (i,i,o). 
clauses 
    select(State, Goals, Goal) :- 
     list::memberIndex_nd(Goal, _, Goals), 
     not(isMember(Goal, State)). % цель не достигнута 

class predicates 
    satisfied : (state*, state* Goals) determ. 
clauses 
    satisfied(_State, []) :- !. 
    satisfied(State, [H|Goals]) :- 
    write("Satisfied State: ", State, " H: ", H), nl, 
    if H = clear('c') then 
     write("sdfg"),nl 
    end if, 
    isMember(H, State), 
    write("yes"),nl, 
    satisfied(State, Goals). 

class predicates 
    conc : (action*, action, action*, action*) nondeterm (i,i,i,o). 
clauses 
    conc([], Action, [], [Action]). 
    conc([], Action, Plan, [Action|Plan]). 
    conc([H|Preplan], Action, Postplan, [H|Plan]) :- 
     conc(Preplan, Action, Postplan, Plan). 

class predicates 
    toStates : (string*) -> state* determ. 
clauses 
    toStates([]) = [] :- !. 
    toStates([H|S]) = L :- 
     H1 = toTerm(state, H), 
     L = [H1|toStates(S)]. 

class predicates 
    optimize : (action*) -> action*. 
clauses 
    optimize([]) = [] :- !. 
    optimize([A]) = [A] :- !. 
    optimize([A1|[A2| Tail]]) = optimize([A3|Tail]) :- 
     A1 = action(From, O, To1), 
     A2 = action(To1, O, To2), 
     !, 
     A3 = action(From, O, To2). 
    optimize([H|T]) = [H|optimize(T)]. 

clauses 
    run():- 
    (Start = toStates(split(readString("start.txt"), ";")), 
    write(Start), 
    Goals= toStates(split(readString("goals.txt"), ";")), 
    plan(Start, Goals, [], Plan, _), 
    PlanO = optimize(Plan), 
    write("Plan: ", PlanO),nl, 
    writeString("plan.txt", toString(PlanO)), 
    !, 
    _ = readLine()); 
    write("It didn't work out!"), 
    _=readline(). 

end implement shift 

ответ

0

execfile, конечно, ошибочно; он предназначен для выполнения другого файла исходного кода Python; os.system действительно работает, но не в этом случае, поэтому я не рекомендую его. Ошибка возникает, потому что текущий рабочий каталог или cwd из planner.exe ошибочен. Прежде чем выполнять его, вы хотите выполнить chdir.

Что вы хотите это subprocess.call, и его cwd аргумент:

import subprocess 
impot os 

path = r'PLANNER\Exe\planner.exe' 
exe = os.path.basename(path) 
cwd = os.path.dirname(path) 
subprocess.call([exe], cwd=cwd) 

exe будет установлен на имя файла в path - 'planner.exe'; и cwd будет содержать часть его папки или r'PLANNER\Exe'. Теперь subprocess.call сначала сменит рабочий каталог на PLANNER\Exe относительно текущего рабочего каталога и запустит в нем planner.exe.


Если вы хотите, чтобы скрипт работать еще более надежной и работать называется ли себя в любом каталоге, вы можете использовать __file__, чтобы узнать каталог самого сценария и найти PLANNER папки по отношению к ней:

import subprocess 
impot os 

relpath = r'PLANNER\Exe\planner.exe' 
path = os.path.join(os.path.dirname(__file__), relpath) 
exe = os.path.basename(path) 
cwd = os.path.dirname(path) 
subprocess.call([exe], cwd=cwd) 

(также see this question о том, как представлять имена путей в Python)

+0

Благодарим за совет, Антти! Но когда я использую 'subprocess.call', я получаю ту же ошибку, что и с' system' ... –

+0

Я добавил код, но он отлично работает, если он запускается немедленно, а не через код Python. –

+0

, если вы запустили его с помощью 'PLANNER \ Exe \ planner.exe' из * этой другой папки *, где вы запускаете скрипт python, он все еще работает? –

-1

\ символ является специальным в строках. Вы говорите, что используете символ \ E и символ \ p. Вам нужно удвоить косую черту как \\, чтобы избежать ее, чтобы получить буквальный символ.

+1

это право в целом, но не проблема с кодом данного. –

+0

Просто попробуйте '' \ E \ p'' в Python shell самостоятельно –

Смежные вопросы