2012-03-11 4 views
0

最近私のWindows OSと一緒に実行するためにUbuntuをインストールしました。私はUbuntuで特定のスクリプトがどのように動作していたかを見たいと思っていました。問題の原因となるコードの一部です。 os.system( 'gnome-open' + filePath)コマンドを使用してファイルを開こうとしましたが、ディレクトリではなくファイル名のみを指定しなければファイルを開くことができません(つまり、 .txt "は、" home/user/workspace/project/src/data.txt "とは言えません。ファイル/ディレクトリが存在しないと言うからです)。また、私はテスト目的のために、このファイルの複数のコピーを作成し、それらのいくつかは名前にカッコがあります。私はこれらのファイルを開くときに "sh:Syntax error:"( "unexpected" 。。コードの行は、私は以下に私が参照しているコードがある、それは私がこの関数を呼び出すときにアクセスのLINEだPythonでLinux上で完全なパス名でファイルを開くことができません

def openFileOfItem(self, row): 
     print fileList[row] 
     if platform.system() == "Windows": 
      os.startfile(fileList[row]) 
     else: 
      if platform.system() == "Linux": 
       os.system('gnome-open ' + nameList[row]) 
      else: 
       os.system('open %s' % fileList[row]) 

想定し、いくつかのサンプル出力:

/home/damian/workspace/Kde Gen/src/data.txt 
Error showing url: Error stating file '/home/damian/workspace/Kde': No such file or directory 
/home/damian/workspace/Kde Gen/src/data (copy).txt 
sh: Syntax error: "(" unexpected 
+1

これをチェックしてください。スペースをエスケープする必要があるかもしれません:http://stackoverflow.com/questions/35817/how-to-escape-os-system-calls-in-python – jmort253

答えて

2

あなたは効果的にシェルコマンドを実行している、そしてそれがでアップトリップなっていますあなたのパスのスペース。引数を引用する代わりに、これを行うのがよりクリーンです:

import subprocess 
subprocess.call([ "gnome-open", nameList[row] ]) 
+0

私はあなたがリストにそれらの議論を置くことを忘れたと思う、少なくとも私はそれを働かせなければならなかった。とにかくおかげで、私はサブプロセスのためのドキュメントを見て、それは言及された他のオプションのための意図された置換のように思われる。 – DamianJ

+0

おっと!確かに私はやった。今修正されました。 – alexis

0

AFAICT、エラーメッセージパスにスペースがあるためです。パスで問題を修正する必要があります。

os.system('gnome-open "%s"' % nameList[row]) 
3

エスケープせずにコマンドラインに直接文字列をダンプします。これにより、シェルが指定したコマンドを実行しようとするとエラーになります。最初にファイルパスをエスケープする必要があります。あなたは、Python 2.7を使用しているので、pipes.quote

from pipes import quote 

def openFileOfItem(self, row): 
    print fileList[row] 
    if platform.system() == "Windows": 
     os.startfile(fileList[row]) 
    else: 
     if platform.system() == "Linux": 
      os.system('gnome-open %s' % quote(nameList[row])) 
     else: 
      os.system('open %s' % quote(fileList[row])) 
+1

最後にチェックしたのはpipes.quoteは完璧ではありませんでしたが二重引用符を投げるよりも優れています(ここでの別の答えのように)。 Pythonに適切な引用符が付いてくるまで、これは実行されます。 :-) – torek

0

I can't say "home/user/workspace/project/src/data.txt" because it'll say the file/directory doesn't exist)

を使用してみてください、あなたは "/home/user/workspace/project/src/data.txt" を意味しましたか?それ以外の場合は、現在のディレクトリに相対的です。

それ以外の場合は、UNIXでは、プログラムを直接実行し、引数ベクトルを渡すバージョンが普通です。それ以外の場合は、シェル(system()によって使用されます)は、注射と呼ばれる)。

os.spawnvp(os.P_WAIT、 "GNOMEオープン"、[ "GNOME-オープン"、NAMELIST [行]])

関連する問題