Чтение файла config.py из скомпилированного скрипта python .exe - PullRequest
2 голосов
/ 24 апреля 2020

Как сделать так, чтобы уже скомпилированный скрипт python, который был превращен в .exe, импортировал файл конфигурации?

Вот что у меня есть:

#Rest of code that show the display and options are above ^

if __name__ == "__main__":

    cwd = os.getcwd()
    variableCheck = Path(cwd + '/config.py')
    print(variableCheck)
    print(cwd)
    variableCheck.is_file()
    if variableCheck.is_file():
        from config import *

        #Next print uses variables from config

        print("ssh = " + ssh + "\nftp = " + ftp + "\nproftpd = " + proftpd + "\nvsftpd = " + vsftpd + "\nweb = " + web + "\napaweb = " + apaweb + "\nnginweb = " + nginweb + "\nhttps = " + https + "\nsmb = " + smb + "\nsql = " + sql + "\nrsnc = " + rsnc)

        print('Configuration file has been loaded...')

        app = QApplication(sys.argv)
        main = Mainstart()
        main.show()
        sys.exit(app.exec_())
    else:
        print('Ello, you have some configurations to do!')
        app = QApplication(sys.argv)
        main = fconfStart()
        main.show()
        sys.exit(app.exec_())

Я не добавил функции fconfStart () или Mainstart (), потому что 1) они действительно длинные и 2) они не являются проблемой, потому что они даже не вызываются, когда я получаю сообщение об ошибке «не могу импортировать конфигурацию»

Функция fconfStart создает файл config.py.

При первом запуске сценария вы создаете файл конфигурации, затем закрываете и снова открываете программу для загрузки с файлом конфигурации config.py

Как файл конфигурации создается в первом время запуска скрипта. Вот что происходит при создании кнопки подтверждения (если это помогает, я использую PyQt5 в этой программе):

#Rest of configuration options that users answer are above this piece of code ^

 def confirmBTTN():
            if self.ssh != '' and self.ftp != '' and self.proftpd != '' and self.vsftpd != '' and self.web != '' and self.apaweb != '' and self.nginweb != '' and self.https != '' and self.smb != '' and self.sql != '' and self.rsnc != '':
                print('saving configurations\n')
                print("ssh=" + self.ssh + ", ftp=" + self.ftp + ", proftpd=" + self.proftpd + ", vsftpd=" + self.vsftpd + ", web=" + self.web + ", apaweb=" + self.apaweb + ", nginweb=" + self.nginweb + ", https=" + self.https + ", smb=" + self.smb + ", sql=" + self.sql + ", rsnc=" + self.rsnc)
                f = open("./config.py", "a+")
                f.write("ssh = " + '"{}"'.format(self.ssh) + "\nftp = " + '"{}"'.format(self.ftp) + "\nproftpd = " + '"{}"'.format(self.proftpd) + "\nvsftpd = " + '"{}"'.format(self.vsftpd) + "\nweb = " + '"{}"'.format(self.web) + "\napaweb = " + '"{}"'.format(self.apaweb) + "\nnginweb = " + '"{}"'.format(self.nginweb) + "\nhttps = " + '"{}"'.format(self.https) + "\nsmb = " + '"{}"'.format(self.smb) + "\nsql = " + '"{}"'.format(self.sql) + "\nrsnc = " + '"{}"'.format(self.rsnc))
                f.close()

                RESTART = QMessageBox()
                RESTART.setWindowTitle("Hey! Listen!")
                RESTART.setText("Reopen the program to continue.")
                RESTART.setIcon(QMessageBox.Information)
                RESTART.setWindowIcon(QtGui.QIcon('HEY.png'))
                RESTART.setStandardButtons(QMessageBox.Close)
                RESTART.buttonClicked.connect(lambda: sys.exit(0))
                x = RESTART.exec_()
            else:
                HEY = QMessageBox()
                HEY.setWindowTitle('Hey! Listen!')
                HEY.setText("Hey! You have not finished filling in all of the choices!")
                HEY.setIcon(QMessageBox.Critical)
                HEY.setWindowIcon(QtGui.QIcon('HEY.png'))
                x = HEY.exec_()

Пример Config.py

ssh = "yes"
ftp = "yes"
proftpd = "yes"
vsftpd = "no"
web = "yes"
apaweb = "yes"
nginweb = "no"
https = "yes"
smb = "yes"
sql = "yes"
rsnc = "no"

(Если мне нужно чтобы использовать другой тип конфигурационного файла, пожалуйста, дайте мне знать) Это то, что создает скрипт. Затем, когда я снова открываю скрипт для использования этого вновь созданного файла конфигурации, я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "ScriptGUIrunner.py", line 380, in <module>
    from config import *
ModuleNotFoundError: No module named 'config'
[20724] Failed to execute script ScriptGUIrunner

Может кто-нибудь помочь мне с этой проблемой? Любая помощь с благодарностью! Если вам нужно, чтобы я добавил что-то, чтобы помочь прояснить проблему, я с радостью сделаю это.

1 Ответ

4 голосов
/ 24 апреля 2020

Когда вы конвертируете скрипт python в .exe, вы лишаете себя возможности динамически загружать python файлы (плюс это может привести к тихим ошибкам).

В целом, если вы хотите сохранить информацию на постоянной основе тогда вам следует использовать любой тип файла (например, .txt), но лучше использовать заранее установленный формат (например, .ini, .yaml, .csv, et c) и использовать библиотеку, которая может безопасно читать такие как ConfigParser, QSettings, et c.

С другой стороны, вы не должны использовать getcwd(), но вы должны получать информацию динамически, поскольку ответы на этот вопрос предполагают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...