Как я могу запустить файл python внутри другого файла python? - PullRequest
0 голосов
/ 19 июня 2020

Мне сложно запустить файл python в другом файле python как модуль. Программа, которую я пытаюсь запустить внутри другого файла python, отлично работает сама по себе. Однако, когда я импортирую его как модуль, он ничего не делает и даже не выдает мне код ошибки. Это первый код. Имя файла - speech2text.py

def mainprogram():

    import os
    import sys
    os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = r"C:\Users\taiki\PycharmProjects\startup\stelarvision-280712-c709366612cc.json"
    filepath = "./"
    output_filepath = "./"
    bucketname = "stelarvision2020"
    sys.path.append("/users/taiki/appdata/local/packages/pythonsoftwarefoundation.python.3.8_qbz5n2kfra8p0/localcache/local-packages/python38/site-packages")
    sys.path.append("/Users/taiki/AppData/Local/Programs/Python/Python38-32/Lib/site-packages")
    from pydub import AudioSegment
    from google.cloud import speech
    from google.cloud.speech import enums
    from google.cloud.speech import types
    import wave
    from google.cloud import storage


    def stereo_to_mono(audio_file_name):
        sound = AudioSegment.from_wav(audio_file_name)
        sound = sound.set_channels(1)
        sound.export(audio_file_name, format="wav")


    def frame_rate_channel(audio_file_name):
        with wave.open(audio_file_name, "rb") as wave_file:
            frame_rate = wave_file.getframerate()
            channels = wave_file.getnchannels()
            return frame_rate, channels


    def upload_blob(bucket_name, source_file_name, destination_blob_name):
        storage_client = storage.Client()
        bucket = storage_client.get_bucket(bucket_name)
        blob = bucket.blob(destination_blob_name)

        blob.upload_from_filename(source_file_name)


    def delete_blob(bucket_name, blob_name):
        storage_client = storage.Client()
        bucket = storage_client.get_bucket(bucket_name)
        blob = bucket.blob(blob_name)

        blob.delete()


    def google_transcribe(audio_file_name):
        file_name = filepath + audio_file_name
        frame_rate, channels = frame_rate_channel(file_name)

        if channels > 1:
            stereo_to_mono(file_name)

        bucket_name = bucketname
        source_file_name = filepath + audio_file_name
        destination_blob_name = audio_file_name

        upload_blob(bucket_name, source_file_name, destination_blob_name)

        gcs_uri = 'gs://' + bucketname + '/' + audio_file_name
        transcript = ''

        client = speech.SpeechClient()
        audio = types.RecognitionAudio(uri=gcs_uri)

        config = types.RecognitionConfig(
            encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
            sample_rate_hertz=frame_rate,
            language_code='en-US',
            enable_automatic_punctuation=True)

        operation = client.long_running_recognize(config, audio)
        response = operation.result(timeout=10000)

        for result in response.results:
            transcript += result.alternatives[0].transcript

        delete_blob(bucket_name, destination_blob_name)
        return transcript


    def write_transcripts(transcript_filename, transcript):
        f = open(output_filepath + transcript_filename, "w+")
        f.write(transcript)
        f.close()


    if __name__ == "__main__":
        audio_file_name = "sample_music.wav"
        transcript = google_transcribe(audio_file_name)
        transcript_filename = audio_file_name.split('.')[0] + '.txt'
        write_transcripts(transcript_filename, transcript)
mainprogram()

Это второй python файл

def run():
    import speech2text
    speech2text.mainprogram()

run()

Когда я выполняю второй файл, он ничего не делает ..

Ответы [ 4 ]

1 голос
/ 19 июня 2020

Часть if __name__ == "__main__": выполняется только тогда, когда вы выполняете этот сценарий напрямую, т.е. python speech2text.py.

Чтобы ваша программа работала, удалите этот if-оператор.

0 голосов
/ 19 июня 2020

Предположим, у вас второе имя файла py - два, а первое - одно имя, теперь для запуска два в одном попробуйте добавить эту строку в один импорт два и запустить их функцию two.run (), и ваши два должны быть такими.

Two learn basi c Python Посетите мой канал на YouTube TechieBaar

0 голосов
/ 19 июня 2020

Во-первых, вы должны поместить импорт за пределы функции, так как это было бы более привычно. Вы также должны проверить, находятся ли два файла в одной папке.

Во-вторых, эта часть не будет работать, если вы вызовете ее за пределами

if __name__ == "__main__":
        audio_file_name = "sample_music.wav"
        transcript = google_transcribe(audio_file_name)
        transcript_filename = audio_file_name.split('.')[0] + '.txt'
        write_transcripts(transcript_filename, transcript)

этот используется, чтобы указать, что нет автоматически запускается при вызове из другой программы, что в основном вы делаете сейчас.

В-третьих, последняя строка mainprogram() в первом файле, не уверен, что вы здесь имеете в виду. У вас уже есть команда для запуска функции во второй программе speech2text.mainprogram() после импорта.

Возможно, вы ошиблись только в одной части, а не во всех трех, которые я предлагаю, поэтому, пожалуйста, попробуйте и проверьте!

0 голосов
/ 19 июня 2020

Структура ваших python файлов немного странная. Лучше import sys и import os в начале файла, чем import что-то в class. Кроме того, у вашего отступа есть проблема. На мой взгляд, вам лучше скачать хорошую IDE, например pycharm, для автоматической проверки ваших синтаксических ошибок.

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