Python 使用“subprocesscall”调用未知目录中的程序

Python 使用“subprocesscall”调用未知目录中的程序,python,subprocess,Python,Subprocess,我正在寻找一种方法来打开同一文件夹中的另一个python文件,但它可能在PC上的任何位置。也就是说,当我将它发送给某人时,程序应该能够找到文件blahblahblah\IDLE\Login,py的路径 这是我在谷歌上搜索过的代码,但我真的不知道我在做什么 from subprocess import call import subprocess import os def main(): subprocess.call(['bash' , os.path.expanduser('~')

我正在寻找一种方法来打开同一文件夹中的另一个python文件,但它可能在PC上的任何位置。也就是说,当我将它发送给某人时,程序应该能够找到文件blahblahblah\IDLE\Login,py的路径

这是我在谷歌上搜索过的代码,但我真的不知道我在做什么

from subprocess import call
import subprocess
import os

def main():
    subprocess.call(['bash' , os.path.expanduser('~')  + "\IDLE\Login.py" ] )

if __name__ == '__main__':
    main()
我知道其中一个子流程导入是冗余的,但在我尝试找到这种新方法时,它只是旧代码的残余

该项目的最终目标是使用主文件并将其转换为可执行文件,以运行目录中相互调用的所有其他文件

非常感谢

下面介绍如何运行bash来执行名为Login.py的脚本,该脚本与当前运行的Python文件位于同一目录中:

import subprocess
import os

def main():
    here = os.path.dirname(os.path.abspath(__file__))
    subprocess.call(['bash', os.path.join(here, "Login.py")])

if __name__ == '__main__':
    main()
__file_u始终是包含正在执行的Python代码的文件的路径


我不知道您为什么要在.py文件上运行bash,但是如果您想要运行python,或者想要在名为Login.sh的文件上运行bash,那么机制是相同的。

这将为您提供脚本位置的完整路径

print('sys.argv[0] =', sys.argv[0])             
pathname = os.path.dirname(sys.argv[0])        
print('path =', pathname)
print('full path =', os.path.abspath(pathname)) 

您不应该有一个未知的目录。@PedroLobito-当程序位于路径中、桌面上有快捷方式或是应用程序启动程序(如“开始”菜单)的一部分时,您不需要知道目录。我认为这些符合未知目录的标准。在简单的情况下,这将起作用。如果使用uuu file_uuu而不是argv[0],它有两个不存在的陷阱:1如果此文件用作另一个文件中包含的模块,argv[0]不在正确的位置;2如果当前工作目录已更改,argv[0]可能包含此代码无法正确解释的相对路径。您好,我也不知道我为什么要用bash。这正是我在网上找到的。我不知道这些都有什么作用。bash运行shell脚本,而不是任意程序,因此bash Login.py不起作用,直接运行Login.py即可。os.path.dirname不够,因为它可能解析为空字符串。os.path.dirnameos.path.abspath\uuuuuu文件\uuuuuu将更一般地工作。@tdelaney-关于第一点,我完全同意,因此我在回答的底部给出了我的评论。我选择不去管这个单独的问题,而不是去记它-@tdelaney-此代码仍将具有所需的效果。代码将以任何方式引用Login.sh文件“\uuuuu file\uuuuuu”引用当前运行的Python文件。除了当前目录更改之外,它应该始终是对该文件的有效引用。但话说回来……哇。你说得对,我的代码没有绝对路径。我犯了同样的错误,我说这只适用于argv[0]。为什么我认为文件总是一条完整的路径我更新了我的答案,以使用您的建议。@tdelaney-如果您知道在程序未更改当前目录的其他上下文中此代码会失败的方式,我非常不赞成这样做,我真的很想知道这种情况是什么。我在代码中的许多地方都使用了这种方法,我很想知道我留给自己的是什么样的bug。-我认为使用abspath可能不会更好。如果_文件_)的内容有可能被误解,我想不出为什么abspath会解决这个问题。