2016-08-24 21 views
0

私は多くの時間、Pythonプロジェクトの実行可能ファイルを作成しようとしました。 、アルドゥイーノとの通信に PyInstallerとPyQtで機能実行可能ファイルを作成できません

  • サブプロセスを::

    1. PyQtは(4):私のGUIのために、
    2. PySerialをこのプロジェクトでは、私が使用する必要があるの.batファイルをいくつかのAVRのものを起動します

    実際には実行可能ファイルが作成されますが、起動しようとすると何も起こりませんが、マウスは私に彼女が占領されていることを教えてくれます。

    私は、私のプロジェクトに必要なすべての機能を凝縮するいくつかの基本的なプログラムを書いて、どこから問題があるのか​​を考え出しました。 python(3.5)からこれを起動するとすべて機能的ですが、pyinstallerによって生成されたファイルを実行すると機能しません。

    from PyQt4 import QtGui 
    from interface import Ui_Form 
    import serial 
    import subprocess 
    import sys, os 
    
    class win(QtGui.QWidget, Ui_Form): 
        """docstring for win""" 
        def __init__(self): 
         super(win, self).__init__() 
         self.setupUi(self) 
         self.ser = serial.Serial("COM3", 9600) 
         self.pathBat = "cmd.bat" 
    
        def on_pushButton_clicked(self): 
          #if (self.ser.isOpen() and self.serAvr.isOpen()): 
          if True: 
           self.ser.write("start".encode()) 
           p = subprocess.call(self.pathBat, creationflags=subprocess.CREATE_NEW_CONSOLE, **self.subprocess_args()) 
    
           if p == 1: 
            self.writeLog("Works") 
            self.ser.write("stop".encode()) 
           #self.writeLog(p.returncode) 
    
        def subprocess_args(include_stdout=True): 
         # The following is true only on Windows. 
         if hasattr(subprocess, 'STARTUPINFO'): 
          # On Windows, subprocess calls will pop up a command window by default 
          # when run from Pyinstaller with the ``--noconsole`` option. Avoid this 
          # distraction. 
          si = subprocess.STARTUPINFO() 
          si.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
          # Windows doesn't search the path by default. Pass it an environment so 
          # it will. 
          env = os.environ 
         else: 
          si = None 
          env = None 
    
    
         ret = {} 
         # On Windows, running this from the binary produced by Pyinstaller 
         # with the ``--noconsole`` option requires redirecting everything 
         # (stdin, stdout, stderr) to avoid an OSError exception 
         # "[Error 6] the handle is invalid." 
         ret.update({'stdin': subprocess.PIPE, 
            'stderr': subprocess.PIPE, 
            'startupinfo': si, 
            'env': env }) 
         return ret 
    
    
    app = QtGui.QApplication(sys.argv) 
    v = win() 
    v.show() 
    sys.exit(app.exec_()) 
    

    私が.specファイル内のデータを「cmd.bat」を追加しました:(それはプッシュボタンで形だけだinterface.pyファイルは、あなたがしたい場合、私はそれが非常に関連性がないの思考、here, in a pastebin.com fileです) pyInstallerの、そして機能subprocess_argがサブプロセスの問題を回避するためにここにある(文書hereにmentionnedとして)

    は、まず私は、私はまだ働いていない、それに対するすべての参照を削除しようとしました、問題はサブプロセスにリンクされていたと思いました。シリアルと同じです。また、.specファイルにdebug = Trueを設定して実行可能ファイルをデバッグしようとしましたが、コンソールからファイルを実行しようとすると、何も起こらず、最初の行でブロックされたままです。

    誰かが助けることができれば!前もって感謝します !

  • +0

    'console = False'を使用していますか?これは、コマンドラインで何も表示されない理由があります。私の最高の推測は、 'インターフェース'が問題の原因だということです。それがビルドに含まれていることを確認するか、ビルドなしでサンプルを作成し、 "フリーズ"しようとします。 – Repiklis

    +0

    私は 'console = True'と' debug = True'を使います。私は、スペックファイルに含めるデータに 'interface.py'を追加しようとしましたが、まだ動作しません – Wogle220

    答えて

    0

    「フリーズ」アプリケーションが「cmd.bat」を見つけられない可能性があります。それを絶対パスで置き換えることでテストできます。

    実行ファイルは、sys._MEIPASSというPythonでアクセス可能な一時フォルダに "cmd.bat"を展開します。あなたはos.path.join(sys._MEIPASS, "cmd.bat")のようなものであなたのファイルを見つけるべきですか?

    必要な場合:getattr(sys, 'frozen', False)は、コードがフリーズしているかどうかを示します(PyInstallerの場合のみ)。

    関連する問題