This is not a duplicate of subprocess.Popen: 'OSError: [Errno 13] Permission denied' only on Linux as that problem occurred due to wrong permissions. That has been fixed and this is an entirely different problem.subprocess.Popen:「OSERROR:[錯誤2]沒有這樣的文件或目錄」僅在Linux
當我的代碼(如下)執行在Windows(包括我的筆記本電腦和AppVeyor CI),它做什麼,它應該去做。但是在Linux上(TravisCI上的虛擬機),它會拋出一個找不到文件的錯誤。
我正在執行/home/travis/build/sayak-brm/espeak4py/
。
ls -l
輸出:
$ ls -l
total 48
-rw-rw-r-- 1 travis travis 500 Sep 29 20:14 appveyor.yml
drwxrwxr-x 3 travis travis 4096 Sep 29 20:14 espeak4py
-rw-rw-r-- 1 travis travis 32400 Sep 29 20:14 LICENSE.md
-rw-rw-r-- 1 travis travis 2298 Sep 29 20:14 README.md
-rw-rw-r-- 1 travis travis 0 Sep 29 20:14 requirements.txt
-rw-rw-r-- 1 travis travis 759 Sep 29 20:14 test.py
$ ls -l espeak4py
total 592
-rwxr-xr-x 1 travis travis 276306 Sep 30 06:42 espeak
drwxrwxr-x 5 travis travis 4096 Sep 29 20:14 espeak-data
-rw-rw-r-- 1 travis travis 319488 Sep 29 20:14 espeak.exe
-rw-rw-r-- 1 travis travis 1125 Sep 29 20:14 __init__.py
$ ls -l /home/travis/build/sayak-brm/espeak4py/espeak4py
total 592
-rwxr-xr-x 1 travis travis 276306 Sep 30 06:42 espeak
drwxrwxr-x 5 travis travis 4096 Sep 30 06:42 espeak-data
-rw-rw-r-- 1 travis travis 319488 Sep 30 06:42 espeak.exe
-rw-rw-r-- 1 travis travis 1216 Sep 30 06:42 __init__.py
其示出了文件在那裏它們被認爲是。
espeak
文件是Linux ELF二進制文件。
錯誤:
$ python3 test.py
Testing espeak4py
Testing wait4prev
Traceback (most recent call last):
File "test.py", line 10, in <module>
mySpeaker.say('Hello, World!')
File "/home/travis/build/sayak-brm/espeak4py/espeak4py/__init__.py", line 38, in say
self.prevproc = subprocess.Popen(cmd, executable=self.executable, cwd=os.path.dirname(os.path.abspath(__file__)))
File "/opt/python/3.2.6/lib/python3.2/subprocess.py", line 744, in __init__
restore_signals, start_new_session)
File "/opt/python/3.2.6/lib/python3.2/subprocess.py", line 1394, in _execute_child
raise child_exception_type(errno_num, err_msg)
OSError: [Errno 2] No such file or directory: '/home/travis/build/sayak-brm/espeak4py/espeak4py/espeak'
代碼:
espeak4py/__init__.py
:
#! python3
import subprocess
import os
import platform
class Speaker:
"""
Speaker class for differentiating different speech properties.
"""
def __init__(self, voice="en", wpm=120, pitch=80):
self.prevproc = None
self.voice = voice
self.wpm = wpm
self.pitch = pitch
if platform.system() == 'Windows': self.executable = os.path.dirname(os.path.abspath(__file__)) + "/espeak.exe"
else: self.executable = os.path.dirname(os.path.abspath(__file__)) + "/espeak"
def generateCommand(self, phrase):
cmd = [
self.executable,
"--path=.",
"-v", self.voice,
"-p", self.pitch,
"-s", self.wpm,
phrase
]
cmd = [str(x) for x in cmd]
return cmd
def say(self, phrase, wait4prev=False):
cmd=self.generateCommand(phrase)
if wait4prev:
try: self.prevproc.wait()
except AttributeError: pass
else:
try: self.prevproc.terminate()
except AttributeError: pass
self.prevproc = subprocess.Popen(cmd, executable=self.executable, cwd=os.path.dirname(os.path.abspath(__file__)))
test.py
:
#! python3
import espeak4py
import time
print('Testing espeak4py\n')
print('Testing wait4prev')
mySpeaker = espeak4py.Speaker()
mySpeaker.say('Hello, World!')
time.sleep(1)
mySpeaker.say('Interrupted!')
time.sleep(3)
mySpeaker.say('Hello, World!')
time.sleep(1)
mySpeaker.say('Not Interrupted.', wait4prev=True)
time.sleep(5)
print('Testing pitch')
myHighPitchedSpeaker = espeak4py.Speaker(pitch=120)
myHighPitchedSpeaker.say('I am a demo of the say function')
time.sleep(5)
print('Testing wpm')
myFastSpeaker = espeak4py.Speaker(wpm=140)
myFastSpeaker.say('I am a demo of the say function')
time.sleep(5)
print('Testing voice')
mySpanishSpeaker = espeak4py.Speaker(voice='es')
mySpanishSpeaker.say('Hola. Como estas?')
print('Testing Completed.')
我不明白爲什麼它只能在一個平臺上,而不是其他。
特拉維斯CI日誌:https://travis-ci.org/sayak-brm/espeak4py
AppVeyor日誌:https://ci.appveyor.com/project/sayak-brm/espeak4py
GitHub上:https://sayak-brm.github.io/espeak4py
再次你'-RW-RW-R - '...您能不能告訴'ls -l命令espeak4py'了'chmod'後? – zvone
哦,我從前面的問題中複製出來,忘了改變它。 – sbrm1
更改並添加了'$ ls -l/home/travis/build/sayak-brm/espeak4py/espeak4py'的輸出。 – sbrm1