从另一个.py文件中使用sys.argv - python

0 投票
4 回答
3135 浏览
提问于 2025-04-18 05:05

我有一个文件(test.py),它会从控制台或bash接收一些参数,叫做 sys.argv

import sys

def main():
    ans = int(sys.argv[1])**int(sys.argv[1])
    with open('test.out', 'w') as fout:
        fout.write(str(ans))

if __name__ == '__main__':
    main()

通常,我可以直接输入 $ python test.py 2 来生成一个叫 test.out 的文件。但我需要从另一个脚本中调用 test.py 里的 main() 函数。

我可以在 (call.py) 里这样做,但 有没有其他方法可以把参数传给 sys.argv,然后再调用 test.py 里的 main() 呢?

import os

number = 2
os.system('python test.py '+str(number))

请注意,我 不能 修改 test.py,而且在 call.py 里我也有一个 main() 函数,它做其他事情。

4 个回答

0

创建一个函数来进行计算和文件写入,这样你就可以在其他模块中调用它:

power.py:

import sys

def power(arg):    
    ans = arg ** arg
    with open('test.out', 'w') as fout:
        fout.write(str(ans))

if __name__ == '__main__':
    power(int(sys.argv[1]))

other.py:

import power

power.power(2)
2

你可以在不修改 test.py 的情况下,照样运行它,只需要在 call.py 中这样做:

import test

test.main()

然后输入 $ python call.py ARG 依然可以正常工作。因为你已经在 test.py 中引入了 sys,所以在 call.py 中不需要再次引入,除非你想在 call.py 中使用 sys。需要注意的是,如果通过 call.py 来使用 test.py,那么 sys.argv[0] 的值会是 'call.py' 而不是 'test.py'

2

这样写:

import sys

def main(num):
    ans = int(num)**int(num)
    with open('test.out', 'w') as fout:
        fout.write(str(ans))

if __name__ == '__main__':
    main(sys.argv[1])

这样你的 main() 函数就不需要知道 sys.argv 是什么了,它只需要处理传递给它的参数。

2

你可以直接使用你的程序。因为无论你用Python调用哪个文件,所有的Python文件都会接收到命令行传递的参数。

不过,你可以让main函数默认接受sys.argv作为参数。这样一来,main函数就会默认使用sys.argv。如果你传入一个不同的列表,它会取第一个元素来处理。

test.py

import sys

def main(args = sys.argv):
    ans = int(args[1])**int(args[1])
    with open('test.out', 'w') as fout:
        fout.write(str(ans))

call.py

import sys, test
test.main()

撰写回答