我可以在Windows系统上调用exe文件,但不能在ubuntu上调用。我不知道是什么错误。 Windows工作正常。
Python版本:
@ Ubuntu的dashseveg:〜/ Folder1 $ Pot3
我的代码:
import subprocess, sys
from subprocess import Popen, PIPE
exe_str = r"\home\dashzeveg\folder\HLR.exe"
parent = subprocess.Popen(exe_str, stderr=subprocess.PIPE)
错误是:
dashzeveg@ubuntu:~/folder1$ python3 call
Traceback (most recent call last):
File "call", line 4, in <module>
parent = subprocess.Popen(exe_str, stderr=subprocess.PIPE)
File "/usr/lib/python3.5/subprocess.py", line 947, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: '\\home\\dashzeveg\\folder\\HLR.exe'
首先检查你的斜线......它们应该是Linux的正斜杠(Windows将与btw一起工作)。
第二...如果在使用子进程模块时没有使用“shell = True”传递命令,那么命令必须作为列表而不是字符串传递(如果命令有多个选项等,则必须将它们分成个别元素)。在你的情况下很容易......你的命令中没有空格,所以它将是一个1元素列表。
既然你正在使用Popen,我假设你想要输出命令?不要忘记将输出解码为()来自二进制字符串的字符串。
这是一个例子:
james@VIII:~/NetBeansProjects/Factorial$ ls
factorial.c factorial.exe
james@VIII:~/NetBeansProjects/Factorial$ ./factorial.exe
5
120
james@VIII:~/NetBeansProjects/Factorial$ /home/james/NetBeansProjects/Factorial/factorial.exe
5
120
james@VIII:~/NetBeansProjects/Factorial$
james@VIII:~/NetBeansProjects/Factorial$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from subprocess import Popen, PIPE
>>> cmd = ["/home/james/NetBeansProjects/Factorial/factorial.exe"]
>>> output = Popen(cmd, stdout=PIPE).communicate()[0].decode()
>>> output
'5\n120\n'
>>> output.strip().split()
['5', '120']
这假设您的exe将真正运行在Linux上。我只是为了清晰和回答你的问题而命名为factorial.exe。通常在Linux上你不会看到一个名为factorial.exe
的文件...它只是factorial
。
如果您确实希望将命令作为字符串传递出于某种原因。你需要shell=True
参数:
>>> from subprocess import Popen, PIPE
>>> cmd = "/home/james/NetBeansProjects/Factorial/factorial.exe"
>>> output = Popen(cmd, stdout=PIPE, shell=True).communicate()[0].decode().strip().split()
>>> output
['5', '120']
您也可以使用os模块执行此操作...社区中的某些人不赞成,但我认为更清晰(代码更少):
>>> from os import popen
>>> cmd = "/home/james/NetBeansProjects/Factorial/factorial.exe"
>>> out = [i.strip() for i in popen(cmd)]
>>> out
['5', '120']