12

私はファイルI/Oを試しています。実行時にテキストファイルを作成する小さな練習プログラムがあります。exeをダブルクリックすると新しいフォルダーが作成され、その中に「helloworld」を含むテキストファイルが配置されるように、pyinstallerでパッケージ化しました。簡単に簡単。

それから私はについて疑問に思い始めましmain()た。これは他の機能と同じですよね?つまり、実行時に引数を渡すことができるということですか?

Steamクライアントと、ショートカットに「-dev」や「-console」などを配置する方法について考えていました。私が作成したPythonexeにこれを行う方法はありますか?

私はひどく説明しているかもしれないので、ここに例があります:

def makeFile(string):
    if string:
        f = open('mytext.txt', 'w') #create text file in local dir
        print >> f, 'hello, ' + string + '! \nHow are ya?'
        f.close()
    else:
        f = open('mytext.txt', 'w') #create text file in local dir
        print >> f, 'hello, person! \nHow are ya?'
        f.close()

def main(string = None):
    makeFile(string)     

したがって、このコードを実行してexeファイルにすると、オプションの引数をなんとかして追加できるでしょうか。

上記のコードを試して実行しtest.exe --"myname"ましたが、うまくいきませんでした。

これを行う方法はありますか?

4

4 に答える 4

9

探しているのは、sysモジュールまたはoptparseモジュールのいずれかです。

sysを使用すると、コマンドライン引数を非常に基本的に制御できます。

例えば:

import sys

if __name__ == "__main__":
    if len(sys.argv)>1:
        print sys.argv[1]

上記の例で、シェルを開いて次のように入力した場合-

test.exe "myname"

結果の出力は次のようになります。

myname

sys.argv [0]は、現在実行しているスクリプトの名前であることに注意してください。後続の各引数はスペースで定義されるため、上記の例では

test.exe -- myname

argv[0] = "test.exe"
argv[1] = "--"
argv[2] = "myname"

Optparseは、複数のオプションを使用してコマンドラインスイッチを定義し、実行時にアクセスできる適切なオプションを格納する変数を定義できる、はるかに堅牢なソリューションを提供します。

例を書き直します。

from optparse import OptionParser

def makeFile(options = None): 
    if options:
        f = open('mytext.txt', 'w') #create text file in local dir
        print >> f, 'hello, ' + options.name + '! \nHow are ya?'
        f.close()
    else:
        f = open('mytext.txt', 'w') #create text file in local dir
        print >> f, 'hello, person! \nHow are ya?'
        f.close()



if __name__ == "__main__":
    parser = OptionParser()
    parser.add_option('-n','--name',dest = 'name',
                      help='username to be printed out')
    (options,args) = parser.parse_args()
    makeFile(options)

次のコマンドでプログラムを実行します。

test.exe -n myname

そして、出力(myfile.txt内)は期待どおりになります。

Hello, myname!
How are ya?

お役に立てば幸いです。

于 2012-04-06T18:08:25.733 に答える
7

はい、でできますsys.argv。このリンクをチェックしてください:http://docs.python.org/library/sys.html#sys.argv。ただし、忘れないでくださいimport sys。そうすれば、それを使用できます。sysをインポート

# If there is an argument passed to your file
if len(sys.argv) > 1:
    # argv[1] has your filename
    filename = sys.argv[1]
    print (filename)

# Output...
# new-host:~ yanwchan$ python3.2 test.py text.txt
# text.txt

argv[0]もっているtest.py

argv[1]もっているtext.txt

編集:しかし、私はこのトピックについてさらに調査を行い、これを見つけました:https ://stackoverflow.com/a/4188500/1276534

katrielalexが指摘しているように、多分あなたも調べることができますargparse。安全チェックだけでなく、より多くの機能を提供します。興味深い情報。

そしてここに素晴らしいチュートリアルがあります:http://www.doughellmann.com/PyMOTW/argparse/

于 2012-04-06T17:48:54.373 に答える
2

あなたが探しているのは、pythonargparseモジュールのようなものです

または、 sys.argvを使用して値を直接読み取ることができます

import sys
sys.argv[0] # the name of the command that was called
sys.argv[1] # the first argument, eg '--dev'
sys.argv[2] # the second...
于 2012-04-06T17:51:40.987 に答える
0

完全を期すための注意点:現在docoptがあり、単純な言語で記述することにより、複雑なコマンドラインインターフェイスでも非常に簡単に記述できます。インターフェイスの文書化と解析は、実際にはdocoptと同じタスクになります。

于 2014-03-19T12:52:46.987 に答える