2017-12-21 42 views
1

これはスタックオーバーフローに関する私の最初の質問です!
私は今、凍結して配布したいブックコレクションを管理するためのPythonスクリプトを作成しています(これは私の最初の '大きな'プロジェクトです)。 多くのオプションを見て、私はCx_Freezeで試してみることにしました。 (私はPython 3.6とCx_Freeze 5.1.1を使用しています)。Pythonのsuprocessがcx_freezeの後で動作しない

このプロジェクトでは、スクリプトから別のスクリプトに移動するために「サブプロセス」を使用することがよくあります。それは私がCx_Freezeが

python setup.py build 

を使用してビルドフォルダを作ってみよう場合、それは同様に動作しますが、私は、インストール後にそれを

python setup.py bdist_msi 

で配布可能ファイルを作成しようとすると、うまく動作しますインタプリタで サブプロセスの最初の呼び出しまで開始し、それ以降は何も実行しません。

はここ

from cx_Freeze import setup, Executable 
import os.path 

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__)) 
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6') 
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6') 
setup(
    name = "Libro", 
    version = "1.0.0", 
    options = {"build_exe": { 
     'packages': ["tkinter", "subprocess", ], 
     'include_files': [os.path.join(PYTHON_INSTALL_DIR, 'DLLs','tk86t.dll'), \ 
     os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), \ 
     'logo50x50.gif', 'check_1.txt', 'check_2.txt', 'start.py', \ 
     'createdb.py', *and_a_few_more_files*], 
    'include_msvcr': True, 
    }}, 
executables = [Executable("Libro.py",base="Win32GUI")] 

setup.pyであり、これは実行可能となりLibro.pyスクリプトです。

#This script checks the documents check_1 and check_2 and then launches 
# createdb.py or start.py 

import subprocess 
from tkinter import * 
import tkinter.messagebox as box 

root= Tk() 
root.withdraw() 

with open('check_1.txt', 'r') as check_1: 
    for line in check_1: 
    line = line.strip() 
    value_1 = int(line) 

with open('check_2.txt', 'r') as check_2: 
    for line in check_2: 
    line = line.strip() 
    value_2 = int(line) 

if value_1 == 0 and value_2 == 0: 
    box.showinfo('Libro 1.0', ''' 
    Welcome to the installation of Libro. 
    I am now creating the database for your catalogue. 
    This may take a moment.''') 
    subprocess.call("createdb.py", shell=True) 

else: 
    subprocess.call("start.py", shell=True) 
    root.mainloop() 

それは、check_1とcheck_2探しTkinterのSHOWINFOウィンドウを示し、その後...それはそれだ、開始します。 私はどんな提案にも非常に感謝しています!ありがとう:)

+0

こんにちはサイモンあり、あなたは、おかげで非常に正しいです。申し訳ありません - – Alessandro

答えて

0

トップレベルのスクリプトだけでなく、すべてのスクリプトをフリーズする必要があります。 (複数のExecutable()エントリを作成します)。そして、サブプロセスを呼び出してフリーズされた実行可能ファイルを実行します。そうしないと、Pythonをターゲットマシンにインストールする必要があります。それから、なぜそれをフリーズするのですか?もちろん、コードを直接ではなくサブプロセスで実行する必要がある理由を説明することも役立ちます。

+0

こんにちはアンソニー、あなたの答えに感謝します。私は複数の実行可能ファイルを作成することについてのポイントを参照してください。私はサブプロセスを選択しました。私が書き始めたとき、それはかなり簡単に見えました。 #!/ usr/bin/env python namescript.pyの代わりに#!/ usr/bin/envのようなものを使うことを提案していると思いますか? おそらくばかげた質問です。すべてのスクリプトをフリーズする予定がある場合、コードを書くときには、フリーズフォームで使用する名前と拡張子を参照する必要がありますか?ありがとうございました!! – Alessandro

+0

はい、それぞれを独立してフリーズすると、それらをフリーズした形で呼び出す必要があります。しかし、単純にサブモジュールをインポートしてその中で関数を呼び出すのは、それほど労力がかかりません。 –

0

最後に、スクリプトをモジュールとして扱い、必要に応じてインポートする方が簡単で経済的なようです。 私はいくつかの単純化された操作を試みました。たとえば :

はmain.py

from tkinter import * 
from modules import from_file 

root = Tk() 
root.title('Trial window') 
btn_1 = Button(root, text='Read from file', command=from_file) 
btn_1.grid(row=1, column=1) 

とmodules.py

from tkinter import * 

def from_file(): 
    ft = open('text.txt', 'r') 
    string = '' 
    for line in ft: 
     line = line.strip() 
     string = string+line 
    ft.close() 

    root2 = Tk() 
    result = Label(root2, text=string) 
    result.grid(row=1, column=1) 
    root2.mainloop() 

ているスクリプトが読み、それが開く新しいウィンドウの 'TEXT.TXT' の内容を視覚化することまた、cx_freezeで凍結された後

PS私が使用しsetup.pyが

from cx_Freeze import setup, Executable 
import os.path 

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__)) 
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6') 
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6') 

setup(
    name = "Prova", 
    version = "1.0.0", 
    options = {"build_exe": { 
      'packages': ["tkinter"], 
      'include_files' : [os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), \ 
      os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), 'text.txt'], 
      'include_msvcr': True, 
      }}, 
     executables = [Executable("main.py", base="Win32GUI")] 
     ) 
関連する問題