Acabei de começar a trabalhar em Python e tenho tentado executar um executável externo de Python.
Tenho um executável para um programa escrito em Fortran. Digamos que o nome do executável seja flow.exe. E meu executável está localizado em C:\Documents and Settings\flow_model
. Tentei os comandos os.system e popen, mas até agora não consegui fazer funcionar. O código a seguir parece que abre a janela de comando, mas não executa o modelo.
# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")
Como posso consertar isso?
python
executable
Mesut
fonte
fonte
Respostas:
Esses espaços em branco podem ser realmente um incômodo :-(. Tente
os.chdir('C:/Documents\ and\ Settings/')
seguir por caminhos relativos paraos.system
,subprocess
métodos ou qualquer outra coisa ...Se as tentativas de melhor esforço para contornar o obstáculo dos espaços em branco continuarem falhando, minha próxima sugestão é evitar espaços em branco em seus caminhos cruciais. Você não poderia fazer um diretório sem espaços em branco, copiar o
.exe
arquivo crucial lá e tentar isso ? Esses espaços destruidores são absolutamente essenciais para o seu bem-estar ...?fonte
subprocess.Popen
para canalizar os valores desejados para lá. Se for mais profundo (usando a entrada "console"), tente wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect .wexpect
é a solução mais provável, pois permite simular exatamente o que aquele arquivo exe veria quando chamado em uma janela cmd.Se estiver usando Python 2.7 ou superior (especialmente antes do Python 3.5), você pode usar o seguinte:
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Executa o comando descrito por args. Espera a conclusão do comando e retorna o atributo returncode.subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Executa o comando com argumentos. Aguarda a conclusão do comando. Se o código de retorno for zero, retorna, caso contrário, gera CalledProcessError. O objeto CalledProcessError terá o código de retorno no atributo returncodeExemplo:
subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])
Aqui está o link para a documentação: http://docs.python.org/3.2/library/subprocess.html
Para Python 3.5+, agora você pode usar run () em muitos casos: https://docs.python.org/3.5/library/subprocess.html#subprocess.run
fonte
A maneira mais simples é:
Funciona; Eu tentei.
fonte
module 'os' has no attribute 'startfile'
. (Usando python3.6)Eu tentaria inserir um 'r' na frente do seu caminho se eu fosse você, para indicar que é uma string bruta - e então você não terá que usar barras. Por exemplo:
fonte
Seu uso está correto. Aposto que seu programa externo, flow.exe, precisa ser executado em seu diretório, pois acessa alguns arquivos externos nele armazenados.
Então você pode tentar:
(Cuidado com as aspas duplas dentro das aspas simples ...)
fonte
Use subprocesso , é um módulo menor, por isso é executado
.exe
mais rápido.fonte
.exe
mais rápido?Usando os.system :
fonte
Experimentar
fonte
Se fosse eu, colocaria o arquivo EXE no diretório raiz (C :) e veria se funciona assim. Em caso afirmativo, são provavelmente os (já mencionados) espaços no nome do diretório. Caso contrário, podem ser algumas variáveis de ambiente.
Além disso, tente verificar seu stderr (usando uma resposta anterior de int3):
O código pode não estar totalmente correto, já que geralmente não uso Popen ou Windows, mas devo dar a ideia. Pode ser que a mensagem de erro esteja no fluxo de erros.
fonte
fonte
em python 2.6, use a string entre aspas "e apóstrofos". Também altere um / para duplo //. Seu exemplo de trabalho será semelhante a este:
Além disso, você pode usar quaisquer parâmetros se o seu programa os ingerir.
finalmente, você pode usar a variável de string, por exemplo, plotagem usando gnuplot diretamente do python:
fonte
Isso está tentando executar
C:\Documents
com argumentos de"and", "Settings/flow_model/flow.exe"
?Além disso, você pode considerar
subprocess.call()
.fonte
Esse é o uso correto, mas talvez os espaços no nome do caminho estejam bagunçando as coisas por algum motivo.
Você também pode executar o programa em cmd.exe para ver qualquer saída de flow.exe que possa indicar um erro.
fonte
Existem muitas soluções diferentes, e os resultados dependerão fortemente de:
Como eu descobri algumas coisas que dizem funcionar apenas no Windows, provavelmente não funciona, provavelmente porque eu uso o Cygwin, que está superando o sistema operacional para lidar com os caminhos do Windows. Outras coisas só funcionam em sistemas operacionais baseados em * nix puro ou em Python2 ou 3.
Aqui estão minhas descobertas:
os.system()
é o método mais tolerante.os.startfile()
é o menos indulgente. (Somente Windows && se você tiver sorte)subprocess.Popen([...])
não recomendadosubprocess.run(winView, shell=True)
a forma recomendada!subprocess
para qualquer coisa pode representar um risco à segurança .Tente esse:
P: Por que você deseja usar
explorer
no Windows?R: Porque se você quiser apenas ver os resultados de algum novo arquivo, o explorer irá abrir automaticamente o arquivo com qualquer programa padrão do Windows que você definiu para aquele tipo de arquivo. Portanto, não há necessidade de especificar novamente o programa padrão a ser usado.
fonte
para a questão acima esta solução funciona.
apenas altere o caminho para onde seu arquivo executável está localizado.
Aqui test1.pdf rootimage é para o meu código.
fonte
"
emos.system
?