鱼C论坛

 找回密码
 立即注册
查看: 2715|回复: 11

[已解决]sys.argv没有添加传入的参数问题

[复制链接]
发表于 2022-9-20 13:54:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
事情的背景是这样的,我写了两个py文件,其中一个是主文件,我们称它main.py,另一个为实际执行的文件,在根目录的detail文件夹下,我们称它为detail\run.py

我试图通过main.py来运行detail\run.py,其中需要从main.py传递一个参数到detail\run.py,于是我在main.py中这样写道:

  1. argu = '我是参数'
  2. os.system('detail\\run.py %s'%(argu))
复制代码


这样,我就应该把 argu = '我是参数' 传入到detail\run.py了,也就是在detail\run.py中print(sys.argv[1])应该能读取到这个传进来的参数。但是现在这样的操作在我自己的两台电脑上都可以正常运行,而在我朋友的电脑上却报错out of range,也就是说这个参数并没有被传进来,sys.argv这个列表只有一个元素即文件路径本身,请问是不是我朋友电脑是不是哪里的配置不对?

我们用的这三台电脑都是python 3.10.5,电脑系统都是Windows 10 x64,所有代码在三台电脑间都都是直接发送没有作任何修改的,当然在所有py文件中都已经导入了os和sys模块
最佳答案
2022-9-27 15:11:48
本帖最后由 阿奇_o 于 2022-9-27 15:20 编辑

假设 在同一目录内 创建以下两个.py文件(模块)
  1. # main.py
  2. import run
  3. import sys, os

  4. def welcome():
  5.     print("~~~~ 欢迎 ~~~~")
  6.   
  7. if __name__ == "__main__":
  8.     welcome()
  9.     name = sys.argv[1]
  10.     # os.system('python run.py ' + name)
  11.     run.do(hello='你好,' + name)
  12.    
复制代码
  1. # run.py
  2. import sys

  3. def do(hello='你好!', sth="接下来,我们要开工了,干活了!!!"):
  4.     print(hello)
  5.     print(sth)

  6. if __name__ == "__main__":
  7.     name = sys.argv[1]
  8.     do(hello='你好,' + name)
复制代码


在该目录内,进入 cmd 或 Powershell 终端命令行,执行: python main.py Alice

ps: 要程序干什么事,增删改查、打印、传参等等,都可以看做是 函数/方法 可以做的事,所以这里的 命令行传参,实际上等同于 调用run.do(...)这个函数  


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-20 17:08:59 | 显示全部楼层
为啥不以import包的形式调用里面的函数呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-20 17:26:36 | 显示全部楼层
你朋友不会是直接运行 run.py 了吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-20 23:30:05 | 显示全部楼层
run.py里面的内容对吗,会不会是其他地方的列表out of range了,而print(sys.argv[1])是正常的?
本身感觉这代码也没问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-23 11:20:59 | 显示全部楼层
suchocolate 发表于 2022-9-20 17:08
为啥不以import包的形式调用里面的函数呢?

因为是由主文件main.py获得参数后,传递给子文件detail\run.py,不是一个固定的值……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-23 11:21:48 | 显示全部楼层
hrpzcf 发表于 2022-9-20 17:26
你朋友不会是直接运行 run.py 了吧?

不是,运行的main.py
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-23 11:29:02 | 显示全部楼层
fcage 发表于 2022-9-20 23:30
run.py里面的内容对吗,会不会是其他地方的列表out of range了,而print(sys.argv[1])是正常的?
本身感觉 ...

应该不是代码本身的问题,因为是直接打包给他的,执行的应该是完全一模一样的,他那个感觉就是像有一道防火墙挡在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)就完全找不到这个应该被传进来的参数,他的电脑是公司给他配置的,我不知道是不是有什么手脚在里面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-23 12:25:11 | 显示全部楼层
renfeib 发表于 2022-9-23 11:29
应该不是代码本身的问题,因为是直接打包给他的,执行的应该是完全一模一样的,他那个感觉就是像有一道防 ...

早说呀,打包和不打包区别就大了,打包后argv的值是exe 收到的参数,而不是 run.py 收到的参数。

话说回来
因为是由主文件main.py获得参数后,传递给子文件detail\run.py,不是一个固定的值……

run.py 中定义好相关函数,main.py 收到参数后直接以传参的方式调用 run.py 中的函数就行了,为什么非要 os.system 的方式调用并传参呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-9-23 20:45:24 | 显示全部楼层
本帖最后由 suchocolate 于 2022-9-23 20:47 编辑
renfeib 发表于 2022-9-23 11:20
因为是由主文件main.py获得参数后,传递给子文件detail\run.py,不是一个固定的值……


函数传参不就是接收变量吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-27 10:51:32 | 显示全部楼层
hrpzcf 发表于 2022-9-23 12:25
早说呀,打包和不打包区别就大了,打包后argv的值是exe 收到的参数,而不是 run.py 收到的参数。

话说 ...

抱歉,我描述有误,我还没有打包成exe,我是指打成压缩包发送给他的……
run.py 中定义好相关函数,main.py 收到参数后直接以传参的方式调用 run.py 中的函数就行了

请问您提到的这个操作要怎么实现呢,因为我现在只会用os.system
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 15:11:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2022-9-27 15:20 编辑

假设 在同一目录内 创建以下两个.py文件(模块)
  1. # main.py
  2. import run
  3. import sys, os

  4. def welcome():
  5.     print("~~~~ 欢迎 ~~~~")
  6.   
  7. if __name__ == "__main__":
  8.     welcome()
  9.     name = sys.argv[1]
  10.     # os.system('python run.py ' + name)
  11.     run.do(hello='你好,' + name)
  12.    
复制代码
  1. # run.py
  2. import sys

  3. def do(hello='你好!', sth="接下来,我们要开工了,干活了!!!"):
  4.     print(hello)
  5.     print(sth)

  6. if __name__ == "__main__":
  7.     name = sys.argv[1]
  8.     do(hello='你好,' + name)
复制代码


在该目录内,进入 cmd 或 Powershell 终端命令行,执行: python main.py Alice

ps: 要程序干什么事,增删改查、打印、传参等等,都可以看做是 函数/方法 可以做的事,所以这里的 命令行传参,实际上等同于 调用run.do(...)这个函数  


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-28 11:47:58 | 显示全部楼层
阿奇_o 发表于 2022-9-27 15:11
假设 在同一目录内 创建以下两个.py文件(模块)

好,虽然还是不清楚为什么只有那位同事的电脑跑不了,但基本是可以确定是cmd的问题,我觉得可能是公司的系统有什么特别的设置。我之前是单纯做成os.system连接两个py文件,我觉得您和之前几位朋友提到的用模块和函数来做(虽然应该是主流才对)比较合适,我会朝这个方向改进
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 13:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表