72166
PyInstallerを使ってPythonのファイルを単一実行ファイルにし、subprocessモジュールでFFmpegとFFproveを実行したいと考えています。myapp.specファイルでbinariesにそれぞれ指定して利用したいのですが、どうやって実行すればよいのか教えていただきたいです。

各ファイルの説明  
・myapp.py (単一実行ファイルにしたいPythonファイル)  
・myapp.app (単一実行ファイル)  
・myapp.spec (pyinstllerでmyapp.pyからmyapp.appを作成する際の設計書)

  

### myapp.specファイルのbinaries

```

    binaries=[('/usr/local/bin/ffmpeg', '.'), ('/usr/local/bin/ffprobe', '.')]
    
```

### myapp.pyでのFFproveの実行の例

```

    subprocess.run(["ffprove", "-i", video_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
```

# 環境

MacOS 10.15.7

Python 3.6  
PyInstaller 3.6  
FFmpeg 4.3.1

# 試したこと

myapp.appファイルの中身を見てみると、myapp.app/Contents/MacOS/にffmpegとffproveの実行形式ファイルのコピーが作られていたので、myapp.appファイルの絶対pathがわかっていれば実行できました。

### /Applications/myapp.appとわかっている場合

```

    subprocess.run(["/Applications/myapp.app/Contents/MacOS/ffprobe", video, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
```

  
どこにmyapp.appがあっても実行できないと困るので、myapp.pyでmyapp.appの絶対パスを取得しようとしたのですが、取得する簡単な方法がわかりませんでした。

myapp.pyでos.getcwd()を出力させると、myapp.appがどこにあろうとルートディレクトリになってしまい、myapp.appの絶対パスはわかりませんでした。

### 現在のwork directory

```

    cwd = os.getcwd()
    # cwdは常に"/"になっている
    
```

  

globを使えばわかりそうなのですが、とても時間がかかってしまいます。

### globでmyapp.appの絶対パスを取得する(時間がかかってしまう)

```

    myapp_path = glob.glob('/**/myapp.app', recursive=True)
    
```
CC BY-SA 4.0
2020-11-23T17:16:17.523
72165
2020-11-23T19:09:14.817
2020-11-23T18:47:28.480
36888
36888
question
python ffmpeg pyinstaller
PyInstallerを使ってPythonファイルの単一実行ファイルを作成し、ffmpegをsubprocessで実行したい
<https://teratail.com/questions/87569>  
コメントで紹介していただいた上記のサイトで解決いたしました。  
sys.argv[0]またはsys.executableで実行ファイルまでの絶対パスが取得できました。

# 絶対パスが/Applications/myapp.appだった場合

```

    print(sys.argv[0]) # 出力 /Aplications/myapp.app/Contents/MacOS/myapp
    print(sys.executable) # 出力 /Aplications/myapp.app/Contents/MacOS/myapp
    # 最後の/myappはmyapp.pyの実行形式ファイル
    
```

ありがとうございました。誰かのお役に立てれば幸いです。
CC BY-SA 4.0
2020-11-23T19:09:14.817
72166
2020-11-23T19:09:14.817
36888
72165
answer