1

小さなプロジェクトとして、私は小さなチャットルームを作成しました。コードは次のとおりです。私はプログラミングに不慣れであるため、構造が効率的でない可能性があることを指摘できます。

import re, time
user_name = 0
password = 0
chatroom = 0

from users import users
def startup():
      global user_name, password, chatroom
      print "\n" * 100
      user_name = raw_input("Your username: ").upper()
      if users.has_key(str(user_name).lower()) == True:
            password = str(raw_input("Password: "))
            while str(users[user_name.lower()]) != str(password):
                  print "Incorrect password."
                  time.sleep(2)
                  startup()
            else:
                  chatroom = raw_input("Room name: ").lower()
                  chat()
      else:
            print "Invalid username."
            time.sleep(2)
            startup()

def showchat():
      global user_name
      file = open(str(chatroom) + ".txt","r+")
      messages = str(file.read()[-700:])
      file.close
      messages = messages.rstrip('\n')
      print "\n" * 40
      print messages
      print "------ type 'r' to refresh the screen ------"

def writechat():
      global user_name, chatroom
      n = raw_input("________________________________________________________" + "\n" + user_name + ": ")      
      if user_name.lower() == 'admin':
            if n == "clear":
                  file = open(str(chatroom) + ".txt","w")
                  file.write("")
                  file.close
            elif n == "addnewuser":
                  x = "'" + raw_input("new username: ") + "'"
                  y = "'" + raw_input("new password: ") + "'"
                  file = open("users.py","r").read()
                  file = file.replace("'username' : 'password',", x + " : " + y + "," + "'username' : 'password',")
                  open("users.py","w").write(file)
            elif n == "r":
                  chat()
            elif n == "logout":
                  startup()
            else:
                  file = open(str(chatroom) + ".txt","a")
                  file.write(user_name + ": " + str(n) + "\n")
                  file.close()
      else:
            if n == "r":
                  chat()
            elif n == "changepassword":
                  file = open("users.py","r")
                  file.read()
                  oldpass = raw_input("New password: ")
                  users[user_name.lower()] = oldpass
                  print users
                  file.close()
                  file = open("users.py","w")
                  file.write("users = " + str(users))         #here
                  file.close()
            elif n == "logout":
                  startup()
            else:
                  file = open(str(chatroom) + ".txt","a")
                  file.write(user_name + ": " + str(n) + "\n")
                  file.close()

def chat():
      showchat()
      writechat()
      chat()


startup()

このコードは、chatroom.txtファイルとusers.pyが存在する限り、Pythonで完全に正常に機能します。.exeに変換すると問題が発生しますが、users.pyファイルが永続的に書き込まれない(一時的に書き込まれる)場合を除いて、問題は正常に機能します。関連するコーディングには#hereのマークが付いています。

私のセットアップコードは次のとおりです。

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
    options = {'py2exe' : {
'packages': ['users'],
"bundle_files" : 2,
}},
    console = [{'script': "chatroom.py"}],
    zipfile = None,
)

users.pyは、単に(user:password)の辞書です。

users = {
'admin' : '2588619',
'john' : '1234',
'username' : 'password',
}

では、どうすればそれを.exeに変換して、users.pyが永続的に書き込まれるようにすることができますか?

4

2 に答える 2

1

py2exeによって作成されたパッケージは、Pythonインタープリターとプログラムを含む単なる自動抽出アーカイブです。.exeが実行されるたびに、内部のすべてが一時ディレクトリに抽出され、プログラムは抽出されたインタプリタによって実行されます。users.pyこれは、ソースコードと一緒にすると、達成しようとしていることは単純に不可能であることを意味します。

users.pyたとえば、次のようなユーザーディレクトリにファイルを作成する必要があります。

users = open(os.path.join(os.path.expanduser('~'), '_MyProgram', 'users.py'))

もちろん、このディレクトリが存在することも確認し、最終的には作成する必要があります。

これは、py2exeがパラメータを渡すことで自動的に実行できdata_filesます。

于 2012-12-18T06:37:49.113 に答える
0

私はそれがusers.pyの名前にあると思います。py2exeはそれが処理する必要があるファイルであると考えています。名前をusers.dbなどに変更します。それが機能するかどうかを確認します。

于 2012-12-18T05:58:53.877 に答える