1

Pythonスクリプトを介してスクリプトファイルを書き込もうとしています

そのために、ファイルを開いたり、書き込んだり、閉じたりする関数を定義しました def funcToCreateScript(filename,filecontent)

別の関数があり、呼び出しfuncToCreateScriptて、変数を介してシェルスクリプトの内容を渡そうとしています。問題は、テキストを次のようにフォーマットするときです

def createfile():
    var = """#!/bin/sh
             echo ${test}
          """
    funcToCreateScript(filename,var)

スクリプトの出力を-として取得します

#!/bin/sh
         echo ${test}

したがって、関数のインデントを取得し、それに応じて書き込みます。次のようにフォーマットする方法はありますか?

#!/bin/sh
echo ${test}

例-

def main():
    var = """
        #!/bin/sh
        echo ${test}
        """
    print var

main()

 > test.py

                #!/bin/sh
                echo ${test}
4

5 に答える 5

3

1 つの方法は、textwrap.dedentを使用することです。

textwrap.dedent(テキスト)

テキストのすべての行から共通の先頭の空白を削除します。

これを使用して、三重引用符で囲まれた文字列をディスプレイの左端に揃え、ソース コードではインデント形式で表示することができます。

import textwrap

def createfile():
    var = """\
          #!/bin/sh
          echo ${test}
          """
    var = textwrap.dedent(var)
    funcToCreateScript(filename, var)

\空行を避けるために、開始の三重引用符の直後に挿入されることに注意してください。

于 2012-12-01T00:08:49.540 に答える
2

ここには 2 つの解決策があります。どちらかは改行エスケープ文字 ('\n') を使用するため、次のようになります。

def createfile():
    var = """#!/bin/sh\necho ${test}"""
    funcToCreateScript(filename,var)

この手法を使用する場合 (これは非常に厄介な解決策です。より良い代替方法については以下を参照してください)、必要な出力を確認したい場合print()(ここでは Python 3.0 標準を想定しています) を覚えておいてください。

または、単純に次のようにします。

def createfile():
    involved. 
    var = """#!/bin/sh
echo ${test}
          """
    return funcToCreateScript(filename,var)

どのようにfuncToCreateScriptセットアップしたかはわかりませんが、実際に動作する様子を確認できるように、いくつかのトライアル コードを示します (コピーして対話型インタープリターまたは新しい python ファイルに貼り付けて実行します)。

def createfile():
    var = """
#!/bin/sh
echo ${test}
          """
    return var

v = createfile()

派手にしたいが、それでも読みやすくしたい場合は、左側からすべての空白を削除する lstrip(" ") を使用できます。

def createfile():
    var = """#!/bin/sh
             echo ${test}
          """
    script_txt = ""

    for line in var:
        script_txt += line.lstrip(" ")

    return script_txt

v = createfile()

そこに意図した空白がある場合、それが取り除かれるので、最後の解決策にうんざりしてください(私は個人的に私がリストしたオプション2が好きです)。

于 2012-11-30T23:57:43.267 に答える
1

変数の最後の行がスペースのみで構成され、その長さがvar最初以外の行の先頭から削除する必要があるスペースの数である場合、次のようなコードを検討してください。

v = var.split('\n')
s = len(v[-1])
var = v[0]+'\n'+'\n'.join(map(lambda x: x[s:], v[1:]))

これによりs、最初の行以外の行の先頭から余分な文字が取り除かれます。タブを使用して位置合わせを行った場合、上記は問題を引き起こす可能性があります。配列のスライスではなく、文字列の置換を使用したい場合があります。

于 2012-12-01T00:11:44.477 に答える
0

別のオプション - 暗黙の連結:

def createfile():
    var = (
        "#!/bin/sh\n"
        "echo ${test}"
    )
于 2012-12-01T00:31:55.523 に答える
0

これを試して:

var = """#!/bin/sh\necho ${test}"""
于 2012-12-01T00:00:17.323 に答える