在运行时向Python制作的可执行文件传递参数是否可行?

14

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

然后我开始思考main()函数。这只是像其他任何函数一样的函数,对吧?那么这是否意味着我可以在运行时向其传递参数?

我在想Steam客户端,你可以在快捷方式中加入像“-dev”和“-console”之类的东西。有没有办法将这些东西添加到我创建的Python可执行文件中?

我的解释可能很糟糕,这里是一个例子:

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"执行,但没有成功。

有什么方法可以实现这个功能吗?

5个回答

12

дҪ еңЁеҜ»жүҫзҡ„еҸҜиғҪжҳҜ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提供了一个更加健壮的解决方案,允许您定义带有多个选项的命令行开关,并定义将存储适当选项的变量,这些变量可以在运行时访问。

重新编写您的示例:

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?

希望能帮到你!


哦,那很不错!谢谢! - Zack

7

是的,你可以使用 sys.argv 来完成。查看此链接: http://docs.python.org/library/sys.html#sys.argv。但要记得不要忘记 import sys,然后就可以使用它了。 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://dev59.com/0G855IYBdhLWcg3wsWv3#4188500

正如katrielalex所指出的那样,也许您可以查看argparse, 它提供了更多的功能以及安全检查。有趣的信息。

这里有一个很棒的教程: http://www.doughellmann.com/PyMOTW/argparse/


更新答案,使用 if len(sys.argv) > 1 来测试是否有文件名参数,并建议使用 argparse(以捕获任何问题)。 - George

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...

0

只是为了完整性而提醒:现在有docopt,它使得通过简单语言描述甚至复杂的命令行界面编写变得非常容易。使用docopt进行文档化和解析实际上成为同一任务。


0
如果您通过命令行运行程序,那么sys.arg[0]会很有帮助。您也可以使用

input()

或者input("<Statement to show to user>: ")来向用户显示语句。使用以下命令编译Python脚本以创建可执行文件(.exe)

pyinstaller --onefile pythonscript.py

双击生成的.exe文件,控制台将显示以下内容:Statement to show to user: 您还可以通过在pythonscript.py中使用多个input()语句来获取多个用户输入。例如:
input_employeeid = input("Enter employee ID (For example: 231206): ")
input_companyname = input("Enter employer company (For example: Zampa solutions): ")

在出现的控制台中,每次输入后请按Enter键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接