12

我正在试验文件 I/O。我有一个小型练习程序,运行时会创建一个文本文件。我用 pyinstaller 打包它,这样双击 exe 会创建一个新文件夹,并在其中放置一个带有“hello world”的文本文件。十分简单。

然后我开始想知道main()。这只是一个和其他任何功能一样的功能,对吧?那么这是否意味着我可以在运行时向它传递参数?

我在考虑 Steam 客户端以及如何将“-dev”和“-console”之类的东西放在快捷方式中。有没有办法对我制作的 python exe 执行此操作?

我可能解释得很糟糕,所以这里有一个例子:

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]

在上面的例子中,如果你打开一个 shell 并输入 -

test.exe "myname"

结果输出将是:

myname

请注意 sys.argv[0] 是您当前正在运行的脚本的名称。每个后续参数都由一个空格定义,因此在上面的示例中

test.exe -- myname

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

Optparse gives a much more robust solution that allows you to define command line switches with multiple options and defines variables that will store the appropriate options that can be accessed at runtime.

重写你的例子:

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,然后就可以使用了。导入系统

# 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

您正在寻找的是类似于 python argparse 模块的东西

或者您可以直接使用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 回答