2017-12-21 9 views
1

이것이 스택 오버플로에 관한 첫 번째 질문입니다!
저는 현재 서적 컬렉션을 관리하기 위해 Python 스크립트 (글쎄요, 실제로 몇 개의 스크립트)를 작성하고 있습니다. 이제는 동결 및 배포하고 싶습니다. (이것이 내 첫 번째 '큰'프로젝트입니다.) 많은 옵션을 살펴본 후에 Cx_Freeze로 시도하기로 결정했습니다. (저는 Python 3.6 및 Cx_Freeze 5.1.1을 사용하고 있습니다).파이썬 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_len 일 및 check_2을 찾습니다, 시작은 Tkinter은 showInfo 창을 보여줍니다 그리고 ... 그것 뿐이다. 나는 어떤 제안이라도 매우 감사 할 것이다!! 고마워요 :)

+0

안녕 사이먼입니다. 죄송합니다 - – Alessandro

답변

0

당신은 최상위 레벨뿐만 아니라 모든 스크립트를 정지시켜야합니다! (여러 Executable() 항목을 작성하십시오). 그런 다음 서브 프로세스를 호출하여 고정 된 실행 파일을 실행합니다. 그렇게하지 않으면 대상 컴퓨터에 Python을 설치해야합니다. 그런 다음 그 이유를 알 필요가 없습니다. 물론 코드를 직접 실행하는 대신 하위 프로세스에서 실행해야하는 이유를 설명하는 것도 도움이 될 수 있습니다.

+0

안녕하세요 anthony, 답변 해 주셔서 감사합니다. 여러 실행 파일을 만드는 방법에 대해 알아 봅니다. 나는 서브 프로세스를 선택 했으므로, 필자가 쓰기 시작했을 때 상당히 간단하게 보였다. #!/usr/bin/env python namescript.py 대신에 다음과 같이 사용할 것을 제안한다고 가정합니다. 아마도 어리석은 질문입니다. 모든 스크립트를 동결 할 계획이라면 내 코드를 작성할 때 얼핏 똑같은 이름과 확장명으로 참조해야합니다. 그렇지 않습니까? 고맙습니다!! – 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")] 
     )