让我们假设文件结构如下。
C:\folder1
file1.py
folder2
folder3
file3.py
我希望file3.py从命令行运行file1及其参数。我需要导入folder1还是file1?怎么样?如何调用脚本?
我尝试了以下
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
sys.path.append(os.path.join(currentdir, '../../'))
答案 0 :(得分:1)
要在Python中运行外部程序,一些常见的选择是subprocess.Popen, subprocess.call,os.system。
以subprocess.Popen和您的文件夹结构为例,这里是file3.py:
import os
import subprocess
current_dir = os.path.dirname(os.path.realpath(__file__))
target_script = os.path.abspath(os.path.join(current_dir, '..', '..', 'file1.py'))
arg1 = 'test_value'
call_args = ['python', target_script, arg1]
subprocess.Popen(call_args)
以上代码将在子进程中运行file1.py,并将'arg1'传递给它。
更多Pythonic解决方案是:将__init__.py file置于“folder1”,“folder2”和“folder3”下,然后Python将这些目录视为包。
在file1.py中:
import sys
def func1(arg):
print 'func1 received: %s' % arg
if __name__ == '__main__':
# better to validate sys.argv here
func1(sys.argv[1])
通过这种方式,您可以在其他python脚本中导入file1.func1,也可以直接在命令行中运行file1.py.
然后,file3.py:
from ...file1 import func1
# "." means current dir, ".." means one level above, and "..." is 2 levels above
func1('test_value')
要执行file3.py:转到folder1的父文件夹(例如,在您的示例中为C:\),然后执行python -m folder1.folder2.folder3.file3
这个解决方案可能看起来更复杂,但随着您的项目变得更大,组织良好的包结构将受益更多。