sys.argv没有添加传入的参数问题
事情的背景是这样的,我写了两个py文件,其中一个是主文件,我们称它main.py,另一个为实际执行的文件,在根目录的detail文件夹下,我们称它为detail\run.py我试图通过main.py来运行detail\run.py,其中需要从main.py传递一个参数到detail\run.py,于是我在main.py中这样写道:
argu = '我是参数'
os.system('detail\\run.py %s'%(argu))
这样,我就应该把 argu = '我是参数' 传入到detail\run.py了,也就是在detail\run.py中print(sys.argv)应该能读取到这个传进来的参数。但是现在这样的操作在我自己的两台电脑上都可以正常运行,而在我朋友的电脑上却报错out of range,也就是说这个参数并没有被传进来,sys.argv这个列表只有一个元素即文件路径本身,请问是不是我朋友电脑是不是哪里的配置不对?
我们用的这三台电脑都是python 3.10.5,电脑系统都是Windows 10 x64,所有代码在三台电脑间都都是直接发送没有作任何修改的,当然在所有py文件中都已经导入了os和sys模块 为啥不以import包的形式调用里面的函数呢? 你朋友不会是直接运行 run.py 了吧? run.py里面的内容对吗,会不会是其他地方的列表out of range了,而print(sys.argv)是正常的?
本身感觉这代码也没问题啊 suchocolate 发表于 2022-9-20 17:08
为啥不以import包的形式调用里面的函数呢?
因为是由主文件main.py获得参数后,传递给子文件detail\run.py,不是一个固定的值…… hrpzcf 发表于 2022-9-20 17:26
你朋友不会是直接运行 run.py 了吧?
不是,运行的main.py fcage 发表于 2022-9-20 23:30
run.py里面的内容对吗,会不会是其他地方的列表out of range了,而print(sys.argv)是正常的?
本身感觉 ...
应该不是代码本身的问题,因为是直接打包给他的,执行的应该是完全一模一样的,他那个感觉就是像有一道防火墙挡在main.py和run.py中间防止传参一样。比如我在主文件main.py打os.system('detail\\run.py某个参数')会报错'detail\\run.py某个参数'这个字符串有问题,因为我少了个空格嘛,说明main.py是认这个'某个参数'的;但是一旦试图传参,在主文件里打os.system('detail\\run.py 某个参数'),这里加了个空格代表我要执行run.py这个文件,并且给与它这个参数,然后跑到run.py里print(sys.argv)就完全找不到这个应该被传进来的参数,他的电脑是公司给他配置的,我不知道是不是有什么手脚在里面 renfeib 发表于 2022-9-23 11:29
应该不是代码本身的问题,因为是直接打包给他的,执行的应该是完全一模一样的,他那个感觉就是像有一道防 ...
早说呀,打包和不打包区别就大了,打包后argv的值是exe 收到的参数,而不是 run.py 收到的参数。
话说回来
因为是由主文件main.py获得参数后,传递给子文件detail\run.py,不是一个固定的值……
run.py 中定义好相关函数,main.py 收到参数后直接以传参的方式调用 run.py 中的函数就行了,为什么非要 os.system 的方式调用并传参呢? 本帖最后由 suchocolate 于 2022-9-23 20:47 编辑
renfeib 发表于 2022-9-23 11:20
因为是由主文件main.py获得参数后,传递给子文件detail\run.py,不是一个固定的值……
函数传参不就是接收变量吗? hrpzcf 发表于 2022-9-23 12:25
早说呀,打包和不打包区别就大了,打包后argv的值是exe 收到的参数,而不是 run.py 收到的参数。
话说 ...
抱歉,我描述有误,我还没有打包成exe,我是指打成压缩包发送给他的……
run.py 中定义好相关函数,main.py 收到参数后直接以传参的方式调用 run.py 中的函数就行了
请问您提到的这个操作要怎么实现呢,因为我现在只会用os.system 本帖最后由 阿奇_o 于 2022-9-27 15:20 编辑
假设 在同一目录内 创建以下两个.py文件(模块)
# main.py
import run
import sys, os
def welcome():
print("~~~~ 欢迎 ~~~~")
if __name__ == "__main__":
welcome()
name = sys.argv
# os.system('python run.py ' + name)
run.do(hello='你好,' + name)
# run.py
import sys
def do(hello='你好!', sth="接下来,我们要开工了,干活了!!!"):
print(hello)
print(sth)
if __name__ == "__main__":
name = sys.argv
do(hello='你好,' + name)
在该目录内,进入 cmd 或 Powershell 终端命令行,执行: python main.py Alice
ps: 要程序干什么事,增删改查、打印、传参等等,都可以看做是 函数/方法 可以做的事,所以这里的 命令行传参,实际上等同于 调用run.do(...)这个函数
阿奇_o 发表于 2022-9-27 15:11
假设 在同一目录内 创建以下两个.py文件(模块)
好,虽然还是不清楚为什么只有那位同事的电脑跑不了,但基本是可以确定是cmd的问题,我觉得可能是公司的系统有什么特别的设置。我之前是单纯做成os.system连接两个py文件,我觉得您和之前几位朋友提到的用模块和函数来做(虽然应该是主流才对)比较合适,我会朝这个方向改进
页:
[1]