2016-09-30 50 views
0

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

+0

再次你'-RW-RW-R - '...您能不能告訴'ls -l命令espeak4py'了'chmod'後? – zvone

+0

哦,我從前面的問題中複製出來,忘了改變它。 – sbrm1

+0

更改並添加了'$ ls -l/home/travis/build/sayak-brm/espeak4py/espeak4py'的輸出。 – sbrm1

回答

0

我測試過的Linux上的espeak Python包裝,它爲我工作。 可能這只是Windows跟蹤\r個字符的問題。 你可以嘗試以下方法:

sed -i 's/^M//' espeak4py/__init__.py 

通過Ctrl-M要進入^M,類型Ctrl-V其次,看看運行sed命令可以解決這個問題。

+0

現在進行測試... – sbrm1

+0

'^ M'的escape char/Unicode名稱是什麼?其實我的主要開發平臺是Windows,因爲我的Linux機箱上的硬盤驅動器崩潰了......即使是角色的十六進制代碼也會這樣。 'Ctrl-V'是在窗口粘貼的快捷方式。 – sbrm1

+0

然後用'\ r'嘗試。它的十六進制代碼是'0x0a' –

相關問題